UNPKG

blumjs

Version:
194 lines (193 loc) 8.03 kB
"use strict"; var common_1 = require("@angular/common"); var dateunit_1 = require("../dateunit"); var elements_1 = require("../elements"); var Jalali = (function () { function Jalali() { this.weekDayNames = ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنج‌شنبه', 'جمعه', 'شنبه']; this.weekFirstDay = 6; this.monthNames = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'ابان', 'آذر', 'دی', 'بهمن', 'اسفند']; this.monthLength = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29]; this.leapYearMonthLength = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 30]; } Jalali.prototype.getNameOfMonth = function (num) { return this.monthNames[num]; }; Jalali.prototype.dateToString = function (date, format) { var res; if (date.getFullYear() > 1800) { res = date; } else { res = Jalali.jalaliToGregorian(+date.getFullYear(), +date.getMonth() + 1, +date.getDate()); res.setMonth(res.getMonth() - 1); } var output = new common_1.DatePipe('fa-fa').transform(res, format); return output.replace('ه‍.ش.', ''); }; Jalali.prototype.dateToDateUnit = function (date) { var uDate = new dateunit_1.DateUnit(); if (date.getFullYear() > 1800) { var tempDate = Jalali.gregorianToJalali(date.getFullYear(), date.getMonth() + 1, date.getDate()); uDate.year = tempDate.jy; uDate.month = tempDate.jm - 1; uDate.day = tempDate.jd; } else { uDate.year = date.getFullYear(); uDate.month = date.getMonth(); uDate.day = date.getDate(); } uDate.hour = date.getHours(); uDate.minute = date.getMinutes(); uDate.seconds = date.getSeconds(); return uDate; }; Jalali.prototype.dateUnitToDate = function (date) { return new Date(date.year, date.month, date.day, date.hour, date.minute, date.seconds); }; Jalali.prototype.getMonthLength = function (date) { var r = Jalali.jalaliCal(date.year); if (r.leap) { return this.monthLength[date.month]; } return this.leapYearMonthLength[date.month]; }; Jalali.prototype.weekHeaders = function () { var row = new elements_1.Row(); for (var i = 0; i < 7; i++) { row.cells[i] = new elements_1.Cell; var index = i + this.weekFirstDay; index -= (i + this.weekFirstDay < 7) ? 0 : 7; row.cells[i].content = this.weekDayNames[index]; } return row; }; Jalali.prototype.dayNumberOfMonthFirst = function (date) { var temp = this.dateUnitToDate(date); return Jalali.jalaliToGregorian(temp.getFullYear(), temp.getMonth(), 1).getDay(); }; Jalali.jalaliToGregorian = function (year, month, day) { var r = Jalali.jalaliCal(year); var d = Jalali.div((r.gy + Jalali.div(3 - 8, 6) + 100100) * 1461, 4) + Jalali.div(153 * Jalali.mod(3 + 9, 12) + 2, 5) + r.march - 34840408; d = d - Jalali.div(Jalali.div(r.gy + 100100 + Jalali.div(3 - 8, 6), 100) * 3, 4) + 752; var result = d + (month - 1) * 31 - Jalali.div(month, 7) * (month - 7) + day - 1; var j, i, gd, gm, gy; j = 4 * result + 139361631; j = j + Jalali.div(Jalali.div(4 * result + 183187720, 146097) * 3, 4) * 4 - 3908; i = Jalali.div(Jalali.mod(j, 1461), 4) * 5 + 308; gd = Jalali.div(Jalali.mod(i, 153), 5) + 1; gm = Jalali.mod(Jalali.div(i, 153), 12) + 1; gy = Jalali.div(j, 1461) - 100100 + Jalali.div(8 - gm, 6); return new Date(gy, gm, gd); }; Jalali.gregorianToJalali = function (year, month, day) { var d = Jalali.div((year + Jalali.div(month - 8, 6) + 100100) * 1461, 4) + Jalali.div(153 * Jalali.mod(month + 9, 12) + 2, 5) + day - 34840408; d = d - Jalali.div(Jalali.div(year + 100100 + Jalali.div(month - 8, 6), 100) * 3, 4) + 752; var j0, i0, gd0, gm0, gy0; j0 = 4 * d + 139361631; j0 = j0 + Jalali.div(Jalali.div(4 * d + 183187720, 146097) * 3, 4) * 4 - 3908; i0 = Jalali.div(Jalali.mod(j0, 1461), 4) * 5 + 308; gd0 = Jalali.div(Jalali.mod(i0, 153), 5) + 1; gm0 = Jalali.mod(Jalali.div(i0, 153), 12) + 1; gy0 = Jalali.div(j0, 1461) - 100100 + Jalali.div(8 - gm0, 6); var d2g = { gy: gy0, gm: gm0, gd: gd0 }; // Calculate Gregorian year (gy). var gy = d2g.gy; var jy = gy - 621; var r = Jalali.jalaliCal(jy); var jdn1f = Jalali.div((gy + Jalali.div(3 - 8, 6) + 100100) * 1461, 4) + Jalali.div(153 * Jalali.mod(3 + 9, 12) + 2, 5) + r.march - 34840408; jdn1f = jdn1f - Jalali.div(Jalali.div(gy + 100100 + Jalali.div(3 - 8, 6), 100) * 3, 4) + 752; var jd; var jm; var k; // Find number of days that passed since 1 Farvardin. k = d - jdn1f; if (k >= 0) { if (k <= 185) { // The first 6 months. jm = 1 + Jalali.div(k, 31); jd = Jalali.mod(k, 31) + 1; return { jy: jy, jm: jm, jd: jd }; } else { // The remaining months. k -= 186; } } else { // Previous Jalali year. jy -= 1; k += 179; if (r.leap === 1) k += 1; } jm = 7 + Jalali.div(k, 30); jd = Jalali.mod(k, 30) + 1; return { jy: jy, jm: jm, jd: jd }; }; Jalali.jalaliCal = function (jy) { var breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178 ], bl = breaks.length, gy1 = jy + 621, leapJ = -14, jp = breaks[0], jm1, jump, leap, leapG, march, n, i1; if (jy < jp || jy >= breaks[bl - 1]) throw new Error('Invalid Jalali year ' + jy); // Find the limiting years for the Jalali year jy. for (i1 = 1; i1 < bl; i1 += 1) { jm1 = breaks[i1]; jump = jm1 - jp; if (jy < jm1) break; leapJ = leapJ + Jalali.div(jump, 33) * 8 + Jalali.div(Jalali.mod(jump, 33), 4); jp = jm1; } n = jy - jp; // Find the number of leap years from AD 621 to the beginning // of the current Jalali year in the Persian calendar. leapJ = leapJ + Jalali.div(n, 33) * 8 + Jalali.div(Jalali.mod(n, 33) + 3, 4); if (Jalali.mod(jump, 33) === 4 && jump - n === 4) leapJ += 1; // And the same in the Gregorian calendar (until the year gy). leapG = Jalali.div(gy1, 4) - Jalali.div((Jalali.div(gy1, 100) + 1) * 3, 4) - 150; // Determine the Gregorian date of Farvardin the 1st. march = 20 + leapJ - leapG; // Find how many years have passed since the last leap year. if (jump - n < 6) n = n - jump + Jalali.div(jump + 4, 33) * 33; leap = Jalali.mod(Jalali.mod(n + 1, 33) - 1, 4); if (leap === -1) { leap = 4; } return { leap: leap, gy: gy1, march: march }; }; Jalali.div = function (a, b) { return ~~(a / b); }; Jalali.mod = function (a, b) { return a - ~~(a / b) * b; }; return Jalali; }()); exports.Jalali = Jalali;