@iro/calendar
Version:
lunar is a calendar library for Solar and Chinese Lunar.
497 lines • 16 kB
JavaScript
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