tarikh
Version:
Jalali, Hijri Shamsi Date
344 lines (293 loc) • 13.3 kB
JavaScript
/**
* Date Converter Functions
* Author: JDF.SCR.IR
* WebSite: http://jdf.scr.ir/
* License: GNU/LGPL
* Version: 1.0.0
*/
/*
هجریشمسی ۱۱۷۸ تا ۱۶۳۳ : دورهی انطباق کامل کبیسهبندی جلالی با اعتدال بهاری
*/
module.exports = class {
static miladi_to_julianDate = (gy, gm, gd) => {
var g_d_m, gy2, julianDate;
g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
gy2 = (gm > 2) ? (gy + 1) : gy;
julianDate = 1721059 + (365 * gy) + (parseInt((gy2 + 3) / 4)) - (parseInt((gy2 + 99) / 100)) + (parseInt((gy2 + 399) / 400)) + gd + g_d_m[gm - 1];
/* 1721059 = miladi_to_julianDate(0, 1, 1) - 1 */
return julianDate - 0.5;
}
static shamsi_to_julianDate = (jy, jm, jd) => {
jy += 1595;
var julianDate = 1365392 + (365 * jy) + ((parseInt(jy / 33)) * 8) + (parseInt(((jy % 33) + 3) / 4)) + jd + ((jm < 7) ? (jm - 1) * 31 : ((jm - 7) * 30) + 186);
/* 1365392=1721059-355746+79 */
return julianDate - 0.5;
}
static julianDate_to_shamsi = (julianDate) => {
var jy, jm, jd, days;
days = parseInt(julianDate - 1365392.5);
jy = -1595 + (33 * (parseInt(days / 12053)));
days %= 12053;
jy += 4 * (parseInt(days / 1461));
days %= 1461;
if (days > 365) {
jy += parseInt((days - 1) / 365);
days = (days - 1) % 365;
}
jm = (days < 186) ? 1 + parseInt(days / 31) : 7 + parseInt((days - 186) / 30);
jd = 1 + ((days < 186) ? (days % 31) : ((days - 186) % 30));
return [jy, jm, jd];
}
static julianDate_to_miladi = (julianDate) => {
var sal_a, gy, gm, gd, days;
days = -parseInt(1721059.5 - julianDate);
gy = 400 * (parseInt(days / 146097));
days %= 146097;
if (days > 36524) {
gy += 100 * (parseInt(--days / 36524));
days %= 36524;
if (days >= 365) days++;
}
gy += 4 * (parseInt(days / 1461));
days %= 1461;
if (days > 365) {
gy += parseInt((days - 1) / 365);
days = (days - 1) % 365;
}
gd = days + 1;
sal_a = [0, 31, ((gy % 4 === 0 && gy % 100 !== 0) || (gy % 400 === 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
for (gm = 0; gm < 13, gd > sal_a[gm]; gm++) {
gd -= sal_a[gm];
}
return [gy, gm, gd];
}
/** Gregorian & Jalali (Hijri_Shamsi,Solar) Date Converter Functions
Author: JDF.SCR.IR =>> Download Full Version : http://jdf.scr.ir/jdf
License: GNU/LGPL _ Open Source & Free :: Version: 2.80 : [2020=1399]
---------------------------------------------------------------------
355746=361590-5844 & 361590=(30*33*365)+(30*8) & 5844=(16*365)+(16/4)
355666=355746-79-1 & 355668=355746-79+1 & 1595=605+990 & 605=621-16
990=30*33 & 12053=(365*33)+(32/4) & 36524=(365*100)+(100/4)-(100/100)
1461=(365*4)+(4/4) & 146097=(365*400)+(400/4)-(400/100)+(400/400) */
static miladi_to_shamsi = (gy, gm, gd) => {
var g_d_m, jy, jm, jd, gy2, days;
g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
gy2 = (gm > 2) ? (gy + 1) : gy;
days = 355666 + (365 * gy) + parseInt((gy2 + 3) / 4) - parseInt((gy2 + 99) / 100) + parseInt((gy2 + 399) / 400) + gd + g_d_m[gm - 1];
jy = -1595 + (33 * parseInt(days / 12053));
days %= 12053;
jy += 4 * parseInt(days / 1461);
days %= 1461;
if (days > 365) {
jy += parseInt((days - 1) / 365);
days = (days - 1) % 365;
}
if (days < 186) {
jm = 1 + parseInt(days / 31);
jd = 1 + (days % 31);
} else {
jm = 7 + parseInt((days - 186) / 30);
jd = 1 + ((days - 186) % 30);
}
return [jy, jm, jd];
}
static shamsi_to_miladi = (jy, jm, jd) => {
var sal_a, gy, gm, gd, days;
jy += 1595;
days = -355668 + (365 * jy) + (parseInt(jy / 33) * 8) + parseInt(((jy % 33) + 3) / 4) + jd + ((jm < 7) ? (jm - 1) * 31 : ((jm - 7) * 30) + 186);
gy = 400 * parseInt(days / 146097);
days %= 146097;
if (days > 36524) {
gy += 100 * parseInt(--days / 36524);
days %= 36524;
if (days >= 365) days++;
}
gy += 4 * parseInt(days / 1461);
days %= 1461;
if (days > 365) {
gy += parseInt((days - 1) / 365);
days = (days - 1) % 365;
}
gd = days + 1;
sal_a = [0, 31, ((gy % 4 === 0 && gy % 100 !== 0) || (gy % 400 === 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) gd -= sal_a[gm];
return [gy, gm, gd];
}
// Private Function
ghamari_to_julianDate_0 = (iy, im, id) => {
return (id + Math.ceil(29.5 * (im - 1)) + (iy - 1) * 354 + Math.floor((3 + (11 * iy)) / 30) + 1948439.5) - 1;
}
// Private Function
julianDate_to_ghamari_0 = (julianDate) => {
var iy, im, id;
julianDate = Math.floor(julianDate) + 0.5;
iy = Math.floor(((30 * (julianDate - 1948439.5)) + 10646) / 10631);
im = Math.min(12, Math.ceil((julianDate - (29 + this.ghamari_to_julianDate_0(iy, 1, 1))) / 29.5) + 1);
id = (julianDate - this.ghamari_to_julianDate_0(iy, im, 1)) + 1;
return [iy, im, id];
}
static miladi_to_ghamari = (gy, gm, gd) => {
return this.julianDate_to_ghamari(this.miladi_to_julianDate(gy, gm, gd));
}
static ghamari_to_miladi = (iy, im, id) => {
return this.julianDate_to_miladi(this.ghamari_to_julianDate(iy, im, id));
}
static shamsi_to_ghamari = (jy, jm, jd) => {
return this.julianDate_to_ghamari(this.shamsi_to_julianDate(jy, jm, jd));
}
static ghamari_to_shamsi = (iy, im, id) => {
return this.julianDate_to_shamsi(this.ghamari_to_julianDate(iy, im, id));
}
// Private
// https://github.com/ilius/starcal/blob/master/scal3/cal_types/hijri-monthes.json
ghamariMonths = {
startYear: 1427,/* =dim:firstYear */
startJd: 2453766.5,/* =ghamari_to_julianDate_0(startYear,1,1) */
endYear: 1442,/* =dim:lastYear */
endJd: 2459435.5,/* =ghamari_to_julianDate_0(endYear+1,1,1)-1 */
dim: {
1427: [355, 30, 29, 29, 30, 29, 30, 30, 30, 30, 29, 29, 30],
1428: [354, 29, 30, 29, 29, 29, 30, 30, 29, 30, 30, 30, 29],
1429: [354, 30, 29, 30, 29, 29, 29, 30, 30, 29, 30, 30, 29],
1430: [354, 30, 30, 29, 29, 30, 29, 30, 29, 29, 30, 30, 29],
1431: [354, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29],
1432: [355, 30, 30, 29, 30, 30, 30, 29, 29, 30, 29, 30, 29],
1433: [355, 29, 30, 29, 30, 30, 30, 29, 30, 29, 30, 29, 30],
1434: [354, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29],
1435: [355, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30],
1436: [354, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30],
1437: [354, 29, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30],
1438: [354, 29, 30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30],
1439: [354, 29, 30, 30, 30, 30, 29, 30, 29, 29, 30, 29, 29],
1440: [355, 30, 29, 30, 30, 30, 29, 30, 30, 29, 29, 30, 29],
1441: [355, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30],
1442: [354/*|355*/, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 29/*|30 :خنثیسازی اختلاف مجموع کل*/]
/*
endJd - ghamari_to_julianDate_0(endYear,12,29)
*/
}
};
static julianDate_to_ghamari = (julianDate) => {
if (julianDate < ghamariMonths.startJd || julianDate > ghamariMonths.endJd) {
return this.julianDate_to_ghamari_0(julianDate);
} else {
let iy, im;
let id = julianDate - ghamariMonths.startJd + 1;
for (iy in ghamariMonths.dim) {
if (id > ghamariMonths.dim[iy][0]) {
id -= ghamariMonths.dim[iy][0];
} else {
for (im = 1; im < 13, id > ghamariMonths.dim[iy][im]; im++) {
id -= ghamariMonths.dim[iy][im];
}
break;
}
}
return [iy, im, id];
}
}
static ghamari_to_julianDate = (iy, im, id) => {
if (iy < ghamariMonths.startYear || iy > ghamariMonths.endYear) {
return this.ghamari_to_julianDate_0(iy, im, id);
} else {
let julianDate = ghamariMonths.startJd - 1 + id;
for (let y in ghamariMonths.dim) {
if (y < iy) {
julianDate += ghamariMonths.dim[y][0];
} else {
for (let m = 1; m < im; m++)julianDate += ghamariMonths.dim[iy][m];
break;
}
}
return julianDate;
}
}
// Private Function, Only for test "ghamariMonths" object
barrasiyeEkhtelafGhamari = () => {
return '\n-----\n' +
this.ghamari_to_julianDate_0(ghamariMonths.startYear, 1, 1) + ' old'
+ '\n' + this.ghamari_to_julianDate(ghamariMonths.startYear, 1, 1) + ' new'
+ '\n\n' + this.julianDate_to_ghamari_0(ghamariMonths.startJd).join('/') + ' old'
+ '\n' + this.julianDate_to_ghamari(ghamariMonths.startJd).join('/') + ' new'
// + '\n-----\n' +
// ghamari_to_julianDate_0(ghamariMonths.endYear, 12, ghamariMonths.dim[ghamariMonths.endYear][12]) + ' old : == or !='
// + '\n' + ghamari_to_julianDate(ghamariMonths.endYear, 12, ghamariMonths.dim[ghamariMonths.endYear][12]) + ' new : == or !='
// + '\n\n' + julianDate_to_ghamari_0(ghamariMonths.endJd).join('/') + ' old : == or !='
// + '\n' + julianDate_to_ghamari(ghamariMonths.endJd).join('/') + ' new : == or !='
+ '\n-----\n' +
/* خنثیسازی اختلاف مجموع کل: اگر نامساوی بود */
this.ghamari_to_julianDate_0(ghamariMonths.endYear + 1, 1, 1) + ' old'
+ '\n' + this.ghamari_to_julianDate(ghamariMonths.endYear + 1, 1, 1) + ' new'
+ '\n\n' + this.julianDate_to_ghamari_0(ghamariMonths.endJd + 1).join('/') + ' old'
+ '\n' + this.julianDate_to_ghamari(ghamariMonths.endJd + 1).join('/') + ' new';
}
static julianDate_to_all = (julianDate) => {
return {
shamsi: this.julianDate_to_shamsi(julianDate),
ghamari: this.julianDate_to_ghamari(julianDate),
miladi: this.julianDate_to_miladi(julianDate)
};
}
///
static timeStamp_to_all = (timeStamp) => {
let julianDate = this.timeStamp_to_julianDate(timeStamp);
return {
shamsi: this.julianDate_to_shamsi(julianDate),
ghamari: this.julianDate_to_ghamari(julianDate),
miladi: this.julianDate_to_miladi(julianDate)
};
};
static timeStamp_to_shamsi = (timeStamp) => {
return this.julianDate_to_shamsi(this.timeStamp_to_julianDate(timeStamp));
}
static timeStamp_to_ghamari = (timeStamp) => {
return this.julianDate_to_ghamari(this.timeStamp_to_julianDate(timeStamp));
}
static timeStamp_to_miladi = (timeStamp) => {
return this.julianDate_to_miladi(this.timeStamp_to_julianDate(timeStamp));
}
static shamsi_to_timeStamp = (year, month, day) => {
return this.julianDate_to_timeStamp(this.shamsi_to_julianDate(year, month, day));
}
static ghamari_to_timeStamp = (year, month, day) => {
return this.julianDate_to_timeStamp(this.ghamari_to_julianDate(year, month, day));
}
static miladi_to_timeStamp = (year, month, day) => {
return this.julianDate_to_timeStamp(this.miladi_to_julianDate(year, month, day));
}
static kabiseh = (year) => {
return ((((year + 12) % 33) % 4) === 1) ? 1 : 0;
}
static mName = () => {
return {
shamsi: ['', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'],
ghamari: ['', 'محرم', 'صفر', 'ربیعالاول', 'ربیعالثانی', 'جمادیالاولی', 'جمادیالثانیه', 'رجب', 'شعبان', 'رمضان', 'شوال', 'ذیالقعده', 'ذیالحجه'],
miladiEn: ['', 'January', 'February', 'March', 'April', 'May', 'Juan', 'July', 'August', 'September', 'October', 'November', 'December'],
miladi: ['', 'ژانویه', 'فوریه', 'مارس', 'آوریل', 'می', 'ژوئن', 'جولای', 'آگوست', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر']
};
}
static roozeHaftehName = () => {
return ['شنبه', 'یکشنبه', 'دوشنبه', 'سهشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه'];
}
static timeStamp_to_julianDate = (timeStamp, time = null) => {
if (Array.isArray(time)) {
let tmp = 0;
if (!isNaN(time[0])) tmp += (time[0] * 3600);
if (!isNaN(time[1])) tmp += (time[1] * 60);
if (!isNaN(time[2])) tmp += time[2];
return (parseInt(timeStamp / 86400000) + (tmp / 86400) + 2440587.5);
}
return ((timeStamp / 86400000) + 2440587.5);
}
static julianDate_to_timeStamp = (julianDate, time = null) => {
if (Array.isArray(time)) {
let tmp = 0;
if (!isNaN(time[0])) tmp += (time[0] * 3600);
if (!isNaN(time[1])) tmp += (time[1] * 60);
if (!isNaN(time[2])) tmp += time[2];
return Math.round((parseInt(julianDate - 2440587.5) * 86400000) + (tmp * 1000));
}
return Math.round((julianDate - 2440587.5) * 86400000);
}
}
//exports.miladi_to_shamsi = miladi_to_shamsi(a,b,c){return [1,2,3]}