lunisolar
Version:
专业农历库,支持公历阴历互转,支持各类黄历数据查询,如八字四柱、阴历、神煞宜忌、时辰吉凶、建除十二神、胎神占方、五行纳音等。支持自定义插件。
277 lines (254 loc) • 10.2 kB
text/typescript
import lunisolar from '../src'
import en from '../src/locale/en'
import ja from '../src/locale/ja'
describe('lunisolar().char8', () => {
it('更改换岁时机, 冬至换岁,中气换月', () => {
const lsr = lunisolar('2022-01-05', { changeAgeTerm: -1 })
expect(lsr.char8.year.toString()).toBe('壬寅')
expect(lsr.char8.month.toString()).toBe('庚子')
expect(lunisolar('2022-01-02', { changeAgeTerm: -1 }).char8.month.toString()).toBe('庚子')
expect(lunisolar('2022-01-02', { changeAgeTerm: -1 }).char8.month.toString()).toBe('庚子')
expect(lunisolar('2022-01-20', { changeAgeTerm: -1 }).char8.month.toString()).toBe('辛丑')
expect(lunisolar('2021-12-21', { changeAgeTerm: -1 }).char8.year.toString()).toBe('壬寅')
expect(lunisolar('2021-12-20', { changeAgeTerm: -1 }).char8.year.toString()).toBe('辛丑')
})
it('更改换岁时机, 大寒换岁,中气换月', () => {
expect(lunisolar('2022-01-05', { changeAgeTerm: 1 }).char8.year.toString()).toBe('辛丑')
expect(lunisolar('2022-01-20', { changeAgeTerm: 1 }).char8.year.toString()).toBe('壬寅')
expect(lunisolar('2022-01-20', { changeAgeTerm: 1 }).char8.month.toString()).toBe('辛丑')
})
it('正月初一换岁', () => {
expect(lunisolar('2022-01-05', { changeAgeTerm: null }).char8.year.toString()).toBe('辛丑')
expect(lunisolar('2022-01-20', { changeAgeTerm: null }).char8.year.toString()).toBe('辛丑')
expect(lunisolar('2022-02-1', { changeAgeTerm: null }).char8.year.toString()).toBe('壬寅')
expect(lunisolar('2022-02-1', { changeAgeTerm: null }).char8.month.toString()).toBe('辛丑')
expect(lunisolar('2022-02-4', { changeAgeTerm: null }).char8.month.toString()).toBe('壬寅')
expect(lunisolar('2022-02-4', { changeAgeTerm: null }).format('cY cM cD')).toBe(
'壬寅 壬寅 戊子'
)
})
it('test 2018-12', () => {
expect(lunisolar('2018-12-06').char8.month.toString()).toBe('癸亥')
expect(lunisolar('2018-12-05').char8.month.toString()).toBe('癸亥')
expect(lunisolar('2018-12-04').char8.month.toString()).toBe('癸亥')
expect(lunisolar('2018-12-03').format('cM')).toBe('癸亥')
expect(lunisolar('2018-12-02').format('cM')).toBe('癸亥')
})
it('test en', () => {
lunisolar.locale(en)
lunisolar.config({
lang: 'zh'
})
expect(lunisolar('2017-12-01', { lang: 'en' }).char8.month.toString()).toBe('Xin-Hai')
})
})
describe('lunisolar().solarTerm', () => {
it('节气', () => {
expect(lunisolar('2022-02-04').solarTerm?.toString()).toBe('立春')
expect(lunisolar('2022-01-20').solarTerm?.toString()).toBe('大寒')
expect(lunisolar('2022-02-1').solarTerm?.toString() || null).toBe(null)
})
it('最近节气', () => {
expect(lunisolar('2022-02-06').recentSolarTerm(0)[0].toString()).toBe('立春')
expect(lunisolar('2022-02-01').recentSolarTerm(0)[0].toString()).toBe('小寒')
expect(lunisolar('2022-02-01').recentSolarTerm(1)[0].toString()).toBe('大寒')
expect(lunisolar('2022-02-22').recentSolarTerm(0)[0].toString()).toBe('立春')
expect(lunisolar('2022-02-22').recentSolarTerm(1)[0].toString()).toBe('雨水')
expect(lunisolar('2022-02-22').recentSolarTerm(2)[0].toString()).toBe('雨水')
})
})
describe('lunisolar.fromLunar', () => {
lunisolar.locale(ja, true)
it('阴历反查', () => {
expect(
lunisolar
.fromLunar({
year: 2022,
month: 10,
day: 25
})
.format('YYYY-MM-DD')
).toBe('2022-11-18')
expect(
lunisolar
.fromLunar({
year: 2020,
month: 104,
day: 24
})
.format('YYYY-MM-DD')
).toBe('2020-06-15')
expect(
lunisolar
.fromLunar({
year: '二〇二零',
month: '閏四月',
day: '廿四'
})
.format('YYYY-MM-DD')
).toBe('2020-06-15')
expect(
lunisolar
.fromLunar({
year: 2020,
month: 4,
day: 24,
isLeapMonth: true
})
.format('YYYY-MM-DD')
).toBe('2020-06-15')
expect(
lunisolar
.fromLunar({
year: 2020,
month: 4,
day: 24
})
.format('YYYY-MM-DD')
).toBe('2020-05-16')
expect(
lunisolar
.fromLunar({
year: 1991,
month: 10,
day: 5
})
.format('YYYY-MM-DD')
).toBe('1991-11-10')
expect(
lunisolar
.fromLunar({
year: '一九九一',
month: '十月',
day: '初五'
})
.format('YYYY-MM-DD')
).toBe('1991-11-10')
expect(
lunisolar
.fromLunar({
year: 2022,
month: 12,
day: 30
})
.format('YYYY-MM-DD')
).toBe('2023-01-21')
expect(
lunisolar
.fromLunar({
year: 2023,
month: 1,
day: 1
})
.format('YYYY-MM-DD')
).toBe('2023-01-22')
expect(
lunisolar
.fromLunar({
year: 2022,
month: 10,
day: 30
})
.format('YYYY-MM-DD')
).toBe('2022-11-23')
expect(
lunisolar
.fromLunar(
{
year: '二〇二〇',
month: '睦月',
day: '一日'
},
{
lang: 'ja'
}
)
.format('YYYY-MM-DD')
).toBe('2020-01-25')
})
})
describe('lunisolar utc', () => {
it('lunisolar.utc', () => {
const utcLsr = lunisolar('2023-03-13 18:23', { isUTC: true })
const lsr = lunisolar('2023-03-13 18:23')
expect(utcLsr.format('YYYY-MM-DD HH:mm')).toBe('2023-03-13 18:23')
expect(lunisolar.utc('2023-03-13 18:23').format('YYYY-MM-DD HH:mm')).toBe('2023-03-13 18:23')
expect(lsr.utc().format('YYYY-MM-DD HH:mm')).toBe('2023-03-13 10:23')
expect(lsr.utc().utcOffset(60).format('YYYY-MM-DD HH:mm')).toBe('2023-03-13 11:23')
expect(
lunisolar('2023-03-13 10:23', { isUTC: true, offset: 60 }).format('YYYY-MM-DD HH:mm')
).toBe('2023-03-13 11:23')
})
it('lunisolar.utc.offset.utc', () => {
const lsr = lunisolar('2023/03/14 09:32')
expect(lsr.utc().utcOffset(-60).format('YYYY-MM-DD HH:mm')).toBe('2023-03-14 00:32')
expect(lsr.utc().utcOffset(-60).utc().format('YYYY-MM-DD HH:mm')).toBe('2023-03-14 01:32')
})
it('lunisolar.utc.local', () => {
const lsr = lunisolar('2023/03/14 10:22')
expect(lsr.format('YYYY/MM/DD HH:mm')).toBe('2023/03/14 10:22')
expect(lsr.utc().format('YYYY/MM/DD HH:mm')).toBe('2023/03/14 02:22')
expect(lsr.utc().local().format('YYYY/MM/DD HH:mm')).toBe('2023/03/14 10:22')
expect(
lunisolar.utc('2023-03-14 10:57').utcOffset(60).local().format('YYYY-MM-DD HH:mm:ss')
).toBe('2023-03-14 18:57:00')
expect(lunisolar.utc('2023-03-14 10:57').local().format('YYYY-MM-DD HH:mm:ss')).toBe(
'2023-03-14 18:57:00'
)
})
it('lunisolar utc clone', () => {
expect(lunisolar('2023/04/09', { offset: 60 }).valueOf()).toBe(1680969600000)
expect(lunisolar('2023/04/09').valueOf()).toBe(1680969600000)
expect(lunisolar('2023/04/09', { offset: 60 }).format('YYYY-MM-DD HH:mm:ss')).toBe(
'2023-04-09 01:00:00'
)
expect(lunisolar('2023/04/09').utcOffset(60).clone().format('YYYY-MM-DD HH:mm:ss')).toBe(
'2023-04-08 17:00:00'
)
})
it('lunisolar.utc.toDate', () => {
const utcLst = lunisolar.utc('2023-03-14 10:57')
expect(lunisolar.utc('2023-03-14 10:57').toDate().valueOf()).toBe(
1678762620000 + 8 * 3600 * 1000
)
expect(lunisolar('2023-03-14 10:57').utc().toDate().valueOf()).toBe(1678762620000)
expect(lunisolar('2023-03-14 10:57').toDate().valueOf()).toBe(1678762620000)
expect(utcLst.toDate().valueOf()).toBe(1678791420000)
expect(utcLst.valueOf()).toBe(1678791420000)
expect(lunisolar('2023-03-14 11:57:00:000').toDate().valueOf()).toBe(1678766220000)
expect(utcLst.utcOffset(60).format('YYYY-MM-DD HH:mm:ss')).toBe('2023-03-14 11:57:00')
expect(utcLst.utcOffset(60).valueOf()).toBe(1678791420000)
expect(utcLst.utcOffset(60).toDate().valueOf()).toBe(1678791420000)
expect((utcLst.utcOffset(60).toDate().valueOf() - 1678791420000) / 3600000).toBe(0)
expect(utcLst.valueOf()).toBe(1678791420000)
})
it('lunisolar lunar', () => {
const utcLst = lunisolar.utc('2023-03-14 14:44')
expect(utcLst.lunar.toString()).toBe('二〇二三年二月廿三未時')
expect(lunisolar('2023-03-14 14:44').lunar.toString()).toBe('二〇二三年二月廿三未時')
expect(lunisolar('2023-03-14 14:44').utc().lunar.toString()).toBe('二〇二三年二月廿三卯時')
expect(lunisolar('2023-03-14 14:44', { offset: -120 }).lunar.toString()).toBe(
'二〇二三年二月廿三午時'
)
expect(lunisolar('2023-03-14 14:44', { offset: -120 }).char8.hour.branch.name).toBe('午')
expect(lunisolar('2023-03-14 14:44').add(-2, 'h').char8.hour.branch.name).toBe('午')
expect(lunisolar('2023-03-14 14:44').utcOffset(6).char8.hour.branch.name).toBe('午')
})
it('lunisolar lunar 22 23', () => {
// Time: 2024/3/6 22:00
const ten = '2024/3/6 10:00'
const tenChar8 = lunisolar(ten).char8
console.log(lunisolar(ten).add(12, 'h').format('YYYY-MM-DD HH:mm:ss'))
const res = `${ten}: ${tenChar8.year.stem.toString()}, ${tenChar8.year.branch.toString()} \
${tenChar8.month.stem.toString()}, ${tenChar8.month.branch.toString()} \
${tenChar8.day.stem.toString()}, ${tenChar8.day.branch.toString()}`
expect(res).toBe('2024/3/6 10:00: 甲, 辰 丁, 卯 己, 巳')
// Time: 2024/3/6 23:00
const eleven = '2024/3/6 23:00'
const elevenChar8 = lunisolar(eleven).add(12, 'h').char8
const res2 = `${eleven}: ${elevenChar8.year.stem.toString()}, ${elevenChar8.year.branch.toString()} \
${elevenChar8.month.stem.toString()}, ${elevenChar8.month.branch.toString()} \
${elevenChar8.day.stem.toString()}, ${elevenChar8.day.branch.toString()}`
expect(res2).toBe('2024/3/6 23:00: 甲, 辰 丁, 卯 庚, 午')
})
})