UNPKG

@iro/calendar

Version:

lunar is a calendar library for Solar and Chinese Lunar.

497 lines 16 kB
import { SolarUtil } from './SolarUtil'; import { SolarWeek } from './SolarWeek'; import { LunarUtil } from './LunarUtil'; import { HolidayUtil } from './HolidayUtil'; import { Lunar } from './Lunar'; import { SolarMonth } from './SolarMonth'; var Solar = (function () { function Solar(year, month, day, hour, minute, second) { if (1582 === year && 10 === month) { if (day > 4 && day < 15) { throw new Error("wrong solar year ".concat(year, " month ").concat(month, " day ").concat(day)); } } if (hour < 0 || hour > 23) { throw new Error("wrong hour ".concat(hour)); } if (minute < 0 || minute > 59) { throw new Error("wrong minute ".concat(minute)); } if (second < 0 || second > 59) { throw new Error("wrong second ".concat(second)); } this._year = year; this._month = month; this._day = day; this._hour = hour; this._minute = minute; this._second = second; } Solar.fromYmd = function (year, month, day) { return Solar.fromYmdHms(year, month, day, 0, 0, 0); }; Solar.fromYmdHms = function (year, month, day, hour, minute, second) { return new Solar(year, month, day, hour, minute, second); }; Solar.fromDate = function (date) { return Solar.fromYmdHms(date.getFullYear(), date.getMonth() + 1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); }; Solar.fromJulianDay = function (julianDay) { var d = Math.floor(julianDay + 0.5); var f = julianDay + 0.5 - d; var c; if (d >= 2299161) { c = Math.floor((d - 1867216.25) / 36524.25); d += 1 + c - Math.floor(c / 4); } d += 1524; var year = Math.floor((d - 122.1) / 365.25); d -= Math.floor(365.25 * year); var month = Math.floor(d / 30.601); d -= Math.floor(30.601 * month); var day = d; if (month > 13) { month -= 13; year -= 4715; } else { month -= 1; year -= 4716; } f *= 24; var hour = Math.floor(f); f -= hour; f *= 60; var minute = Math.floor(f); f -= minute; f *= 60; var second = Math.round(f); if (second > 59) { second -= 60; minute++; } if (minute > 59) { minute -= 60; hour++; } return Solar.fromYmdHms(year, month, day, hour, minute, second); }; Solar.fromBaZi = function (yearGanZhi, monthGanZhi, dayGanZhi, timeGanZhi, sect, baseYear) { if (sect === void 0) { sect = 2; } if (baseYear === void 0) { baseYear = 1900; } sect = (1 == sect) ? 1 : 2; var l = []; var years = []; var today = Solar.fromDate(new Date()); var offsetYear = LunarUtil.getJiaZiIndex(today.getLunar().getYearInGanZhiExact()) - LunarUtil.getJiaZiIndex(yearGanZhi); if (offsetYear < 0) { offsetYear = offsetYear + 60; } var startYear = today.getYear() - offsetYear - 1; while (true) { years.push(startYear); startYear -= 60; if (startYear < baseYear) { years.push(baseYear); break; } } var hour = 0; var timeZhi = timeGanZhi.substr(1); for (var i = 0, j = LunarUtil.ZHI.length; i < j; i++) { if (LunarUtil.ZHI[i] === timeZhi) { hour = (i - 1) * 2; } } for (var i = 0, j = years.length; i < j; i++) { inner: for (var x = 0; x < 3; x++) { var year = years[i] + x; var solar = Solar.fromYmdHms(year, 1, 1, hour, 0, 0); while (solar.getYear() === year) { var lunar = solar.getLunar(); var dgz = (2 === sect) ? lunar.getDayInGanZhiExact2() : lunar.getDayInGanZhiExact(); if (lunar.getYearInGanZhiExact() === yearGanZhi && lunar.getMonthInGanZhiExact() === monthGanZhi && dgz === dayGanZhi && lunar.getTimeInGanZhi() === timeGanZhi) { l.push(solar); break inner; } solar = solar.next(1); } } } return l; }; Solar.prototype.getYear = function () { return this._year; }; Solar.prototype.getMonth = function () { return this._month; }; Solar.prototype.getDay = function () { return this._day; }; Solar.prototype.getHour = function () { return this._hour; }; Solar.prototype.getMinute = function () { return this._minute; }; Solar.prototype.getSecond = function () { return this._second; }; Solar.prototype.getWeek = function () { var start = Solar.fromYmdHms(1582, 10, 15, 0, 0, 0); var y = this._year; var m = this._month; var d = this._day; var current = Solar.fromYmdHms(y, m, d, 0, 0, 0); if (m < 3) { m += 12; y--; } var c = Math.floor(y / 100); y = y - c * 100; var x = y + Math.floor(y / 4) + Math.floor(c / 4) - 2 * c; var w; if (current.isBefore(start)) { w = (x + Math.floor((13 * (m + 1)) / 5) + d + 2) % 7; } else { w = (x + Math.floor((26 * (m + 1)) / 10) + d - 1) % 7; } return (w + 7) % 7; }; Solar.prototype.getWeekInChinese = function () { return SolarUtil.WEEK[this.getWeek()]; }; Solar.prototype.getSolarWeek = function (start) { return SolarWeek.fromYmd(this._year, this._month, this._day, start); }; Solar.prototype.isLeapYear = function () { return SolarUtil.isLeapYear(this._year); }; Solar.prototype.getFestivals = function () { var l = []; var f = SolarUtil.FESTIVAL.get(this._month + '-' + this._day); if (f) { l.push(f); } var weeks = Math.ceil(this._day / 7); var week = this.getWeek(); f = SolarUtil.WEEK_FESTIVAL.get(this._month + '-' + weeks + '-' + week); if (f) { l.push(f); } if (this._day + 7 > SolarUtil.getDaysOfMonth(this._year, this._month)) { f = SolarUtil.WEEK_FESTIVAL.get(this._month + '-0-' + week); if (f) { l.push(f); } } return l; }; Solar.prototype.getOtherFestivals = function () { var l = []; var fs = SolarUtil.OTHER_FESTIVAL.get(this._month + '-' + this._day); if (fs) { fs.forEach(function (f) { l.push(f); }); } return l; }; Solar.prototype.getXingzuo = function () { return this.getXingZuo(); }; Solar.prototype.getXingZuo = function () { var index = 11; var y = this._month * 100 + this._day; if (y >= 321 && y <= 419) { index = 0; } else if (y >= 420 && y <= 520) { index = 1; } else if (y >= 521 && y <= 621) { index = 2; } else if (y >= 622 && y <= 722) { index = 3; } else if (y >= 723 && y <= 822) { index = 4; } else if (y >= 823 && y <= 922) { index = 5; } else if (y >= 923 && y <= 1023) { index = 6; } else if (y >= 1024 && y <= 1122) { index = 7; } else if (y >= 1123 && y <= 1221) { index = 8; } else if (y >= 1222 || y <= 119) { index = 9; } else if (y <= 218) { index = 10; } return SolarUtil.XINGZUO[index]; }; Solar.prototype.toYmd = function () { var y = this._year + ''; while (y.length < 4) { y = '0' + y; } return [y, (this._month < 10 ? '0' : '') + this._month, (this._day < 10 ? '0' : '') + this._day].join('-'); }; Solar.prototype.toYmdHms = function () { return this.toYmd() + ' ' + [(this._hour < 10 ? '0' : '') + this._hour, (this._minute < 10 ? '0' : '') + this._minute, (this._second < 10 ? '0' : '') + this._second].join(':'); }; Solar.prototype.toString = function () { return this.toYmd(); }; Solar.prototype.toFullString = function () { var s = this.toYmdHms(); if (this.isLeapYear()) { s += ' 闰年'; } s += ' 星期' + this.getWeekInChinese(); var festivals = this.getFestivals(); festivals.forEach(function (f) { s += ' (' + f + ')'; }); s += ' ' + this.getXingZuo() + '座'; return s; }; Solar.prototype.nextYear = function (years) { var y = this._year + years; var m = this._month; var d = this._day; if (2 === m) { if (d > 28) { if (!SolarUtil.isLeapYear(y)) { d = 28; } } } if (1582 === y && 10 === m) { if (d > 4 && d < 15) { d += 10; } } return Solar.fromYmdHms(y, m, d, this._hour, this._minute, this._second); }; Solar.prototype.nextMonth = function (months) { var month = SolarMonth.fromYm(this._year, this._month).next(months); var y = month.getYear(); var m = month.getMonth(); var d = this._day; if (2 === m) { if (d > 28) { if (!SolarUtil.isLeapYear(y)) { d = 28; } } } if (1582 === y && 10 === m) { if (d > 4 && d < 15) { d += 10; } } return Solar.fromYmdHms(y, m, d, this._hour, this._minute, this._second); }; Solar.prototype.nextDay = function (days) { var y = this._year; var m = this._month; var d = this._day; if (1582 === y && 10 === m) { if (d > 4) { d -= 10; } } if (days > 0) { d += days; var daysInMonth = SolarUtil.getDaysOfMonth(y, m); while (d > daysInMonth) { d -= daysInMonth; m++; if (m > 12) { m = 1; y++; } daysInMonth = SolarUtil.getDaysOfMonth(y, m); } } else if (days < 0) { while (d + days <= 0) { m--; if (m < 1) { m = 12; y--; } d += SolarUtil.getDaysOfMonth(y, m); } d += days; } if (1582 === y && 10 === m) { if (d > 4) { d += 10; } } return Solar.fromYmdHms(y, m, d, this._hour, this._minute, this._second); }; Solar.prototype.next = function (days, onlyWorkday) { if (onlyWorkday === void 0) { onlyWorkday = false; } if (onlyWorkday) { var solar = Solar.fromYmdHms(this._year, this._month, this._day, this._hour, this._minute, this._second); if (days !== 0) { var rest = Math.abs(days); var add = days < 1 ? -1 : 1; while (rest > 0) { solar = solar.next(add); var work = true; var holiday = HolidayUtil.getHoliday(solar.getYear(), solar.getMonth(), solar.getDay()); if (!holiday) { var week = solar.getWeek(); if (0 === week || 6 === week) { work = false; } } else { work = holiday.isWork(); } if (work) { rest -= 1; } } } return solar; } else { return this.nextDay(days); } }; Solar.prototype.nextHour = function (hours) { var h = this._hour + hours; var n = h < 0 ? -1 : 1; var hour = Math.abs(h); var days = Math.floor(hour / 24) * n; hour = (hour % 24) * n; if (hour < 0) { hour += 24; days--; } var solar = this.next(days); return Solar.fromYmdHms(solar.getYear(), solar.getMonth(), solar.getDay(), hour, solar.getMinute(), solar.getSecond()); }; Solar.prototype.getLunar = function () { return Lunar.fromSolar(this); }; Solar.prototype.getJulianDay = function () { var y = this._year; var m = this._month; var d = this._day + ((this._second / 60 + this._minute) / 60 + this._hour) / 24; var n = 0; var g = false; if (y * 372 + m * 31 + Math.floor(d) >= 588829) { g = true; } if (m <= 2) { m += 12; y--; } if (g) { n = Math.floor(y / 100); n = 2 - n + Math.floor(n / 4); } return Math.floor(365.25 * (y + 4716)) + Math.floor(30.6001 * (m + 1)) + d + n - 1524.5; }; Solar.prototype.isBefore = function (solar) { if (this._year > solar.getYear()) { return false; } if (this._year < solar.getYear()) { return true; } if (this._month > solar.getMonth()) { return false; } if (this._month < solar.getMonth()) { return true; } if (this._day > solar.getDay()) { return false; } if (this._day < solar.getDay()) { return true; } if (this._hour > solar.getHour()) { return false; } if (this._hour < solar.getHour()) { return true; } if (this._minute > solar.getMinute()) { return false; } if (this._minute < solar.getMinute()) { return true; } return this._second < solar.getSecond(); }; Solar.prototype.isAfter = function (solar) { if (this._year > solar.getYear()) { return true; } if (this._year < solar.getYear()) { return false; } if (this._month > solar.getMonth()) { return true; } if (this._month < solar.getMonth()) { return false; } if (this._day > solar.getDay()) { return true; } if (this._day < solar.getDay()) { return false; } if (this._hour > solar.getHour()) { return true; } if (this._hour < solar.getHour()) { return false; } if (this._minute > solar.getMinute()) { return true; } if (this._minute < solar.getMinute()) { return false; } return this._second > solar.getSecond(); }; Solar.prototype.subtract = function (solar) { return SolarUtil.getDaysBetween(solar.getYear(), solar.getMonth(), solar.getDay(), this._year, this._month, this._day); }; Solar.prototype.subtractMinute = function (solar) { var days = this.subtract(solar); var cm = this._hour * 60 + this._minute; var sm = solar.getHour() * 60 + solar.getMinute(); var m = cm - sm; if (m < 0) { m += 1440; days--; } m += days * 1440; return m; }; Solar.J2000 = 2451545; return Solar; }()); export { Solar }; //# sourceMappingURL=Solar.js.map