UNPKG

tarikh

Version:
344 lines (293 loc) 13.3 kB
/** * 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]}