|
|
|
|
class PersianDate {
|
|
|
|
|
|
|
|
|
|
persianMonthNames = ['', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
|
|
|
|
|
|
|
|
|
|
settings= {
|
|
|
|
|
gSpliter: '/',
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* from parsi date by mobin ghasem pour
|
|
|
|
|
* @param {integer} year
|
|
|
|
|
* @returns {Boolean}
|
|
|
|
|
*/
|
|
|
|
|
isLeapYear = function (year) {
|
|
|
|
|
if (((year % 4) === 0 && (year % 100) !== 0) || ((year % 400) === 0) && (year % 100) === 0)
|
|
|
|
|
return true;
|
|
|
|
|
else
|
|
|
|
|
return false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parseHindi = function (str) {
|
|
|
|
|
|
|
|
|
|
let r = str.toString();
|
|
|
|
|
let org = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
|
|
|
|
let hindi = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
|
|
|
|
|
for (var ch in org) {
|
|
|
|
|
r = r.replace(new RegExp(org[ch], 'g'), hindi[ch]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return r;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exploiter = function (date_txt, determ) {
|
|
|
|
|
if (typeof determ === 'undefined') {
|
|
|
|
|
determ = '/';
|
|
|
|
|
}
|
|
|
|
|
let a = date_txt.split(determ);
|
|
|
|
|
|
|
|
|
|
if (typeof a[2] === 'undefined') {
|
|
|
|
|
return a;
|
|
|
|
|
}
|
|
|
|
|
if (a[0].length < a[2].length) {
|
|
|
|
|
return [a[2], a[1], a[0]];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return a;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
imploiter = function (date_txt, determ) {
|
|
|
|
|
if (determ === undefined) {
|
|
|
|
|
determ = '/';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return date_txt[0] + determ + date_txt[1] + determ + date_txt[2];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* from parsi date by mobin ghasem pour
|
|
|
|
|
* @param {Array} indate
|
|
|
|
|
* @returns {Array}
|
|
|
|
|
*/
|
|
|
|
|
persian2Gregorian = function (indate) {
|
|
|
|
|
let jy = indate[0];
|
|
|
|
|
let jm = indate[1];
|
|
|
|
|
let jd = indate[2];
|
|
|
|
|
let gd;
|
|
|
|
|
let j_days_sum_month = [0, 0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 365];
|
|
|
|
|
let g_days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
|
|
|
let g_days_leap_month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
|
|
|
gd = j_days_sum_month[parseInt(jm)] + parseInt(jd);
|
|
|
|
|
let gy = parseInt(jy) + 621;
|
|
|
|
|
if (gd > 286)
|
|
|
|
|
gy++;
|
|
|
|
|
if (this.isLeapYear(gy - 1) && 286 < gd)
|
|
|
|
|
gd--;
|
|
|
|
|
if (gd > 286)
|
|
|
|
|
gd -= 286;
|
|
|
|
|
else
|
|
|
|
|
gd += 79;
|
|
|
|
|
let gm;
|
|
|
|
|
if (this.isLeapYear(gy)) {
|
|
|
|
|
for (gm = 0; gd > g_days_leap_month[gm]; gm++) {
|
|
|
|
|
gd -= g_days_leap_month[gm];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (gm = 0; gd > g_days_in_month[gm]; gm++)
|
|
|
|
|
gd -= g_days_in_month[gm];
|
|
|
|
|
}
|
|
|
|
|
gm++;
|
|
|
|
|
if (gm < 10)
|
|
|
|
|
gm = '0' + gm;
|
|
|
|
|
gd = gd < 10 ? '0'+gd: gd;
|
|
|
|
|
return [gy, gm, gd];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* from parsi date by mobin ghasem pour
|
|
|
|
|
* @param {Array} indate
|
|
|
|
|
* @returns {Array}
|
|
|
|
|
*/
|
|
|
|
|
gregorian2Persian = function (indate) {
|
|
|
|
|
|
|
|
|
|
let gy, gm, gd, j_days_in_month, g_days_sum_month, dayofyear, leab, leap, jd, jy, jm, i;
|
|
|
|
|
|
|
|
|
|
gy = indate[0];
|
|
|
|
|
gm = indate[1];
|
|
|
|
|
gd = indate[2];
|
|
|
|
|
|
|
|
|
|
j_days_in_month = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29];
|
|
|
|
|
g_days_sum_month = [0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
|
|
|
|
|
dayofyear = g_days_sum_month[parseInt(gm)] + parseInt(gd);
|
|
|
|
|
leab = this.isLeapYear(gy);
|
|
|
|
|
leap = this.isLeapYear(gy - 1);
|
|
|
|
|
if (dayofyear > 79) {
|
|
|
|
|
jd = (leab ? dayofyear - 78 : dayofyear - 79);
|
|
|
|
|
jy = gy - 621;
|
|
|
|
|
for (i = 0; jd > j_days_in_month[i]; i++) {
|
|
|
|
|
jd -= j_days_in_month[i];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
jd = ((leap || (leab && gm > 2)) ? 287 + dayofyear : 286 + dayofyear);
|
|
|
|
|
jy = gy - 622;
|
|
|
|
|
if (leap == 0 && jd == 366)
|
|
|
|
|
return [jy, 12, 30];
|
|
|
|
|
for (i = 0; jd > j_days_in_month[i]; i++) {
|
|
|
|
|
jd -= j_days_in_month[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
jm = ++i;
|
|
|
|
|
jm = (jm < 10 ? jm = '0' + jm : jm);
|
|
|
|
|
if (jm == 13) {
|
|
|
|
|
jm = 12;
|
|
|
|
|
jd = 30;
|
|
|
|
|
}
|
|
|
|
|
if (jm.toString().length == 1) {
|
|
|
|
|
jm = '0' + jm;
|
|
|
|
|
}
|
|
|
|
|
if (jd.toString().length == 1) {
|
|
|
|
|
jd = '0' + jd;
|
|
|
|
|
}
|
|
|
|
|
return [jy.toString(), jm, jd];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
convertDate2Persian = function (dt){
|
|
|
|
|
let tmp = dt.toLocaleString('fa-IR-u-nu-latn')
|
|
|
|
|
.split('،')
|
|
|
|
|
.join(',');
|
|
|
|
|
let date = tmp.split(',');
|
|
|
|
|
let result = date[0].split('/');
|
|
|
|
|
result[1] = this.make2number(result[1]);
|
|
|
|
|
result[2] = this.make2number(result[2]);
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
make2number = function (instr) {
|
|
|
|
|
let num = instr.toString();
|
|
|
|
|
return num.length === 2 ? num : '0' + num;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gDate2Timestamp = function (stri) {
|
|
|
|
|
return Math.round(new Date(stri + " 00:00:00").getTime() / 1000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gTimestamp2Date = function (unix_timestamp) {
|
|
|
|
|
let date = new Date(unix_timestamp * 1000);
|
|
|
|
|
return date.getFullYear() + settings.gSpliter + date.getMonth() + 1 + settings.gSpliter + date.getDate();
|
|
|
|
|
}
|
|
|
|
|
pDate2Timestamp = function (stri) {
|
|
|
|
|
return this.gDate2Timestamp(this.imploiter(this.persian2Gregorian(this.exploiter(stri))));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pTimestamp2Date = function (unix_timestamp) {
|
|
|
|
|
let date = new Date(unix_timestamp * 1000);
|
|
|
|
|
return this.imploiter(this.gregorian2Persian([date.getFullYear(), date.getMonth() + 1, date.getDate()]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getPersianWeekDay = function (jdate) {
|
|
|
|
|
|
|
|
|
|
let tmp = this.imploiter(this.persian2Gregorian(this.exploiter(jdate)), '/');
|
|
|
|
|
let dd = new Date(tmp + " 00:00:00").getDay() + 1;
|
|
|
|
|
if (dd > 6) {
|
|
|
|
|
dd -= 7;
|
|
|
|
|
}
|
|
|
|
|
return dd;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
pGetLastDayMonth = function (mn, yr) {
|
|
|
|
|
let tmp;
|
|
|
|
|
let last = 29;
|
|
|
|
|
let now = this.pDate2Timestamp(yr + '/' + mn + '/' + (29));
|
|
|
|
|
for (let i = 1; i < 4; i++) {
|
|
|
|
|
now += 86400;
|
|
|
|
|
tmp = this.exploiter(this.pTimestamp2Date(now));
|
|
|
|
|
if (tmp[2] < last) {
|
|
|
|
|
return last;
|
|
|
|
|
} else {
|
|
|
|
|
last = tmp[2];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return last;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default PersianDate;
|