lunar.ts 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111
  1. /**
  2. * @1900-2100区间内的公历、农历互转
  3. * @charset UTF-8
  4. * @Author syp
  5. * @Time 2022-07-26
  6. * @Version 1.0.3
  7. * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
  8. * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
  9. */
  10. const lunar = {
  11. /**
  12. * 农历1900-2100的润大小信息表
  13. * @Array Of Property
  14. * @return Hex
  15. */
  16. lunarInfo: [
  17. 0x04bd8,
  18. 0x04ae0,
  19. 0x0a570,
  20. 0x054d5,
  21. 0x0d260,
  22. 0x0d950,
  23. 0x16554,
  24. 0x056a0,
  25. 0x09ad0,
  26. 0x055d2, //1900-1909
  27. 0x04ae0,
  28. 0x0a5b6,
  29. 0x0a4d0,
  30. 0x0d250,
  31. 0x1d255,
  32. 0x0b540,
  33. 0x0d6a0,
  34. 0x0ada2,
  35. 0x095b0,
  36. 0x14977, //1910-1919
  37. 0x04970,
  38. 0x0a4b0,
  39. 0x0b4b5,
  40. 0x06a50,
  41. 0x06d40,
  42. 0x1ab54,
  43. 0x02b60,
  44. 0x09570,
  45. 0x052f2,
  46. 0x04970, //1920-1929
  47. 0x06566,
  48. 0x0d4a0,
  49. 0x0ea50,
  50. 0x16a95,
  51. 0x05ad0,
  52. 0x02b60,
  53. 0x186e3,
  54. 0x092e0,
  55. 0x1c8d7,
  56. 0x0c950, //1930-1939
  57. 0x0d4a0,
  58. 0x1d8a6,
  59. 0x0b550,
  60. 0x056a0,
  61. 0x1a5b4,
  62. 0x025d0,
  63. 0x092d0,
  64. 0x0d2b2,
  65. 0x0a950,
  66. 0x0b557, //1940-1949
  67. 0x06ca0,
  68. 0x0b550,
  69. 0x15355,
  70. 0x04da0,
  71. 0x0a5b0,
  72. 0x14573,
  73. 0x052b0,
  74. 0x0a9a8,
  75. 0x0e950,
  76. 0x06aa0, //1950-1959
  77. 0x0aea6,
  78. 0x0ab50,
  79. 0x04b60,
  80. 0x0aae4,
  81. 0x0a570,
  82. 0x05260,
  83. 0x0f263,
  84. 0x0d950,
  85. 0x05b57,
  86. 0x056a0, //1960-1969
  87. 0x096d0,
  88. 0x04dd5,
  89. 0x04ad0,
  90. 0x0a4d0,
  91. 0x0d4d4,
  92. 0x0d250,
  93. 0x0d558,
  94. 0x0b540,
  95. 0x0b6a0,
  96. 0x195a6, //1970-1979
  97. 0x095b0,
  98. 0x049b0,
  99. 0x0a974,
  100. 0x0a4b0,
  101. 0x0b27a,
  102. 0x06a50,
  103. 0x06d40,
  104. 0x0af46,
  105. 0x0ab60,
  106. 0x09570, //1980-1989
  107. 0x04af5,
  108. 0x04970,
  109. 0x064b0,
  110. 0x074a3,
  111. 0x0ea50,
  112. 0x06b58,
  113. 0x05ac0,
  114. 0x0ab60,
  115. 0x096d5,
  116. 0x092e0, //1990-1999
  117. 0x0c960,
  118. 0x0d954,
  119. 0x0d4a0,
  120. 0x0da50,
  121. 0x07552,
  122. 0x056a0,
  123. 0x0abb7,
  124. 0x025d0,
  125. 0x092d0,
  126. 0x0cab5, //2000-2009
  127. 0x0a950,
  128. 0x0b4a0,
  129. 0x0baa4,
  130. 0x0ad50,
  131. 0x055d9,
  132. 0x04ba0,
  133. 0x0a5b0,
  134. 0x15176,
  135. 0x052b0,
  136. 0x0a930, //2010-2019
  137. 0x07954,
  138. 0x06aa0,
  139. 0x0ad50,
  140. 0x05b52,
  141. 0x04b60,
  142. 0x0a6e6,
  143. 0x0a4e0,
  144. 0x0d260,
  145. 0x0ea65,
  146. 0x0d530, //2020-2029
  147. 0x05aa0,
  148. 0x076a3,
  149. 0x096d0,
  150. 0x04afb,
  151. 0x04ad0,
  152. 0x0a4d0,
  153. 0x1d0b6,
  154. 0x0d250,
  155. 0x0d520,
  156. 0x0dd45, //2030-2039
  157. 0x0b5a0,
  158. 0x056d0,
  159. 0x055b2,
  160. 0x049b0,
  161. 0x0a577,
  162. 0x0a4b0,
  163. 0x0aa50,
  164. 0x1b255,
  165. 0x06d20,
  166. 0x0ada0, //2040-2049
  167. /**Add By JJonline@JJonline.Cn**/
  168. 0x14b63,
  169. 0x09370,
  170. 0x049f8,
  171. 0x04970,
  172. 0x064b0,
  173. 0x168a6,
  174. 0x0ea50,
  175. 0x06b20,
  176. 0x1a6c4,
  177. 0x0aae0, //2050-2059
  178. 0x092e0,
  179. 0x0d2e3,
  180. 0x0c960,
  181. 0x0d557,
  182. 0x0d4a0,
  183. 0x0da50,
  184. 0x05d55,
  185. 0x056a0,
  186. 0x0a6d0,
  187. 0x055d4, //2060-2069
  188. 0x052d0,
  189. 0x0a9b8,
  190. 0x0a950,
  191. 0x0b4a0,
  192. 0x0b6a6,
  193. 0x0ad50,
  194. 0x055a0,
  195. 0x0aba4,
  196. 0x0a5b0,
  197. 0x052b0, //2070-2079
  198. 0x0b273,
  199. 0x06930,
  200. 0x07337,
  201. 0x06aa0,
  202. 0x0ad50,
  203. 0x14b55,
  204. 0x04b60,
  205. 0x0a570,
  206. 0x054e4,
  207. 0x0d160, //2080-2089
  208. 0x0e968,
  209. 0x0d520,
  210. 0x0daa0,
  211. 0x16aa6,
  212. 0x056d0,
  213. 0x04ae0,
  214. 0x0a9d4,
  215. 0x0a2d0,
  216. 0x0d150,
  217. 0x0f252, //2090-2099
  218. 0x0d520
  219. ], //2100
  220. /**
  221. * 公历每个月份的天数普通表
  222. * @Array Of Property
  223. * @return Number
  224. */
  225. solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
  226. /**
  227. * 天干地支之天干速查表
  228. * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
  229. * @return Cn string
  230. */
  231. Gan: [
  232. '\u7532',
  233. '\u4e59',
  234. '\u4e19',
  235. '\u4e01',
  236. '\u620a',
  237. '\u5df1',
  238. '\u5e9a',
  239. '\u8f9b',
  240. '\u58ec',
  241. '\u7678'
  242. ],
  243. /**
  244. * 天干地支之地支速查表
  245. * @Array Of Property
  246. * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
  247. * @return Cn string
  248. */
  249. Zhi: [
  250. '\u5b50',
  251. '\u4e11',
  252. '\u5bc5',
  253. '\u536f',
  254. '\u8fb0',
  255. '\u5df3',
  256. '\u5348',
  257. '\u672a',
  258. '\u7533',
  259. '\u9149',
  260. '\u620c',
  261. '\u4ea5'
  262. ],
  263. /**
  264. * 天干地支之地支速查表<=>生肖
  265. * @Array Of Property
  266. * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
  267. * @return Cn string
  268. */
  269. Animals: [
  270. '\u9f20',
  271. '\u725b',
  272. '\u864e',
  273. '\u5154',
  274. '\u9f99',
  275. '\u86c7',
  276. '\u9a6c',
  277. '\u7f8a',
  278. '\u7334',
  279. '\u9e21',
  280. '\u72d7',
  281. '\u732a'
  282. ],
  283. /**
  284. * 阳历节日
  285. */
  286. festival: {
  287. '1-1': { title: '元旦节' },
  288. '2-14': { title: '情人节' },
  289. '5-1': { title: '劳动节' },
  290. '5-4': { title: '青年节' },
  291. '6-1': { title: '儿童节' },
  292. '9-10': { title: '教师节' },
  293. '10-1': { title: '国庆节' },
  294. '12-25': { title: '圣诞节' },
  295. '3-8': { title: '妇女节' },
  296. '3-12': { title: '植树节' },
  297. '4-1': { title: '愚人节' },
  298. '5-12': { title: '护士节' },
  299. '7-1': { title: '建党节' },
  300. '8-1': { title: '建军节' },
  301. '12-24': { title: '平安夜' }
  302. },
  303. /**
  304. * 农历节日
  305. */
  306. lFestival: {
  307. '12-30': { title: '除夕' },
  308. '1-1': { title: '春节' },
  309. '1-15': { title: '元宵节' },
  310. '2-2': { title: '龙抬头' },
  311. '5-5': { title: '端午节' },
  312. '7-7': { title: '七夕节' },
  313. '7-15': { title: '中元节' },
  314. '8-15': { title: '中秋节' },
  315. '9-9': { title: '重阳节' },
  316. '10-1': { title: '寒衣节' },
  317. '10-15': { title: '下元节' },
  318. '12-8': { title: '腊八节' },
  319. '12-23': { title: '北方小年' },
  320. '12-24': { title: '南方小年' }
  321. },
  322. /**
  323. * 返回默认定义的阳历节日
  324. */
  325. getFestival() {
  326. return this.festival
  327. },
  328. /**
  329. * 返回默认定义的内容里节日
  330. */
  331. getLunarFestival() {
  332. return this.lFestival
  333. },
  334. /**
  335. *
  336. * @param param {Object} 按照festival的格式输入数据,设置阳历节日
  337. */
  338. setFestival(param = {}) {
  339. this.festival = param
  340. },
  341. /**
  342. *
  343. * @param param {Object} 按照lFestival的格式输入数据,设置农历节日
  344. */
  345. setLunarFestival(param = {}) {
  346. this.lFestival = param
  347. },
  348. /**
  349. * 24节气速查表
  350. * @Array Of Property
  351. * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
  352. * @return Cn string
  353. */
  354. solarTerm: [
  355. '\u5c0f\u5bd2',
  356. '\u5927\u5bd2',
  357. '\u7acb\u6625',
  358. '\u96e8\u6c34',
  359. '\u60ca\u86f0',
  360. '\u6625\u5206',
  361. '\u6e05\u660e',
  362. '\u8c37\u96e8',
  363. '\u7acb\u590f',
  364. '\u5c0f\u6ee1',
  365. '\u8292\u79cd',
  366. '\u590f\u81f3',
  367. '\u5c0f\u6691',
  368. '\u5927\u6691',
  369. '\u7acb\u79cb',
  370. '\u5904\u6691',
  371. '\u767d\u9732',
  372. '\u79cb\u5206',
  373. '\u5bd2\u9732',
  374. '\u971c\u964d',
  375. '\u7acb\u51ac',
  376. '\u5c0f\u96ea',
  377. '\u5927\u96ea',
  378. '\u51ac\u81f3'
  379. ],
  380. /**
  381. * 1900-2100各年的24节气日期速查表
  382. * @Array Of Property
  383. * @return 0x string For splice
  384. */
  385. sTermInfo: [
  386. '9778397bd097c36b0b6fc9274c91aa',
  387. '97b6b97bd19801ec9210c965cc920e',
  388. '97bcf97c3598082c95f8c965cc920f',
  389. '97bd0b06bdb0722c965ce1cfcc920f',
  390. 'b027097bd097c36b0b6fc9274c91aa',
  391. '97b6b97bd19801ec9210c965cc920e',
  392. '97bcf97c359801ec95f8c965cc920f',
  393. '97bd0b06bdb0722c965ce1cfcc920f',
  394. 'b027097bd097c36b0b6fc9274c91aa',
  395. '97b6b97bd19801ec9210c965cc920e',
  396. '97bcf97c359801ec95f8c965cc920f',
  397. '97bd0b06bdb0722c965ce1cfcc920f',
  398. 'b027097bd097c36b0b6fc9274c91aa',
  399. '9778397bd19801ec9210c965cc920e',
  400. '97b6b97bd19801ec95f8c965cc920f',
  401. '97bd09801d98082c95f8e1cfcc920f',
  402. '97bd097bd097c36b0b6fc9210c8dc2',
  403. '9778397bd197c36c9210c9274c91aa',
  404. '97b6b97bd19801ec95f8c965cc920e',
  405. '97bd09801d98082c95f8e1cfcc920f',
  406. '97bd097bd097c36b0b6fc9210c8dc2',
  407. '9778397bd097c36c9210c9274c91aa',
  408. '97b6b97bd19801ec95f8c965cc920e',
  409. '97bcf97c3598082c95f8e1cfcc920f',
  410. '97bd097bd097c36b0b6fc9210c8dc2',
  411. '9778397bd097c36c9210c9274c91aa',
  412. '97b6b97bd19801ec9210c965cc920e',
  413. '97bcf97c3598082c95f8c965cc920f',
  414. '97bd097bd097c35b0b6fc920fb0722',
  415. '9778397bd097c36b0b6fc9274c91aa',
  416. '97b6b97bd19801ec9210c965cc920e',
  417. '97bcf97c3598082c95f8c965cc920f',
  418. '97bd097bd097c35b0b6fc920fb0722',
  419. '9778397bd097c36b0b6fc9274c91aa',
  420. '97b6b97bd19801ec9210c965cc920e',
  421. '97bcf97c359801ec95f8c965cc920f',
  422. '97bd097bd097c35b0b6fc920fb0722',
  423. '9778397bd097c36b0b6fc9274c91aa',
  424. '97b6b97bd19801ec9210c965cc920e',
  425. '97bcf97c359801ec95f8c965cc920f',
  426. '97bd097bd097c35b0b6fc920fb0722',
  427. '9778397bd097c36b0b6fc9274c91aa',
  428. '97b6b97bd19801ec9210c965cc920e',
  429. '97bcf97c359801ec95f8c965cc920f',
  430. '97bd097bd07f595b0b6fc920fb0722',
  431. '9778397bd097c36b0b6fc9210c8dc2',
  432. '9778397bd19801ec9210c9274c920e',
  433. '97b6b97bd19801ec95f8c965cc920f',
  434. '97bd07f5307f595b0b0bc920fb0722',
  435. '7f0e397bd097c36b0b6fc9210c8dc2',
  436. '9778397bd097c36c9210c9274c920e',
  437. '97b6b97bd19801ec95f8c965cc920f',
  438. '97bd07f5307f595b0b0bc920fb0722',
  439. '7f0e397bd097c36b0b6fc9210c8dc2',
  440. '9778397bd097c36c9210c9274c91aa',
  441. '97b6b97bd19801ec9210c965cc920e',
  442. '97bd07f1487f595b0b0bc920fb0722',
  443. '7f0e397bd097c36b0b6fc9210c8dc2',
  444. '9778397bd097c36b0b6fc9274c91aa',
  445. '97b6b97bd19801ec9210c965cc920e',
  446. '97bcf7f1487f595b0b0bb0b6fb0722',
  447. '7f0e397bd097c35b0b6fc920fb0722',
  448. '9778397bd097c36b0b6fc9274c91aa',
  449. '97b6b97bd19801ec9210c965cc920e',
  450. '97bcf7f1487f595b0b0bb0b6fb0722',
  451. '7f0e397bd097c35b0b6fc920fb0722',
  452. '9778397bd097c36b0b6fc9274c91aa',
  453. '97b6b97bd19801ec9210c965cc920e',
  454. '97bcf7f1487f531b0b0bb0b6fb0722',
  455. '7f0e397bd097c35b0b6fc920fb0722',
  456. '9778397bd097c36b0b6fc9274c91aa',
  457. '97b6b97bd19801ec9210c965cc920e',
  458. '97bcf7f1487f531b0b0bb0b6fb0722',
  459. '7f0e397bd07f595b0b6fc920fb0722',
  460. '9778397bd097c36b0b6fc9274c91aa',
  461. '97b6b97bd19801ec9210c9274c920e',
  462. '97bcf7f0e47f531b0b0bb0b6fb0722',
  463. '7f0e397bd07f595b0b0bc920fb0722',
  464. '9778397bd097c36b0b6fc9210c91aa',
  465. '97b6b97bd197c36c9210c9274c920e',
  466. '97bcf7f0e47f531b0b0bb0b6fb0722',
  467. '7f0e397bd07f595b0b0bc920fb0722',
  468. '9778397bd097c36b0b6fc9210c8dc2',
  469. '9778397bd097c36c9210c9274c920e',
  470. '97b6b7f0e47f531b0723b0b6fb0722',
  471. '7f0e37f5307f595b0b0bc920fb0722',
  472. '7f0e397bd097c36b0b6fc9210c8dc2',
  473. '9778397bd097c36b0b70c9274c91aa',
  474. '97b6b7f0e47f531b0723b0b6fb0721',
  475. '7f0e37f1487f595b0b0bb0b6fb0722',
  476. '7f0e397bd097c35b0b6fc9210c8dc2',
  477. '9778397bd097c36b0b6fc9274c91aa',
  478. '97b6b7f0e47f531b0723b0b6fb0721',
  479. '7f0e27f1487f595b0b0bb0b6fb0722',
  480. '7f0e397bd097c35b0b6fc920fb0722',
  481. '9778397bd097c36b0b6fc9274c91aa',
  482. '97b6b7f0e47f531b0723b0b6fb0721',
  483. '7f0e27f1487f531b0b0bb0b6fb0722',
  484. '7f0e397bd097c35b0b6fc920fb0722',
  485. '9778397bd097c36b0b6fc9274c91aa',
  486. '97b6b7f0e47f531b0723b0b6fb0721',
  487. '7f0e27f1487f531b0b0bb0b6fb0722',
  488. '7f0e397bd097c35b0b6fc920fb0722',
  489. '9778397bd097c36b0b6fc9274c91aa',
  490. '97b6b7f0e47f531b0723b0b6fb0721',
  491. '7f0e27f1487f531b0b0bb0b6fb0722',
  492. '7f0e397bd07f595b0b0bc920fb0722',
  493. '9778397bd097c36b0b6fc9274c91aa',
  494. '97b6b7f0e47f531b0723b0787b0721',
  495. '7f0e27f0e47f531b0b0bb0b6fb0722',
  496. '7f0e397bd07f595b0b0bc920fb0722',
  497. '9778397bd097c36b0b6fc9210c91aa',
  498. '97b6b7f0e47f149b0723b0787b0721',
  499. '7f0e27f0e47f531b0723b0b6fb0722',
  500. '7f0e397bd07f595b0b0bc920fb0722',
  501. '9778397bd097c36b0b6fc9210c8dc2',
  502. '977837f0e37f149b0723b0787b0721',
  503. '7f07e7f0e47f531b0723b0b6fb0722',
  504. '7f0e37f5307f595b0b0bc920fb0722',
  505. '7f0e397bd097c35b0b6fc9210c8dc2',
  506. '977837f0e37f14998082b0787b0721',
  507. '7f07e7f0e47f531b0723b0b6fb0721',
  508. '7f0e37f1487f595b0b0bb0b6fb0722',
  509. '7f0e397bd097c35b0b6fc9210c8dc2',
  510. '977837f0e37f14998082b0787b06bd',
  511. '7f07e7f0e47f531b0723b0b6fb0721',
  512. '7f0e27f1487f531b0b0bb0b6fb0722',
  513. '7f0e397bd097c35b0b6fc920fb0722',
  514. '977837f0e37f14998082b0787b06bd',
  515. '7f07e7f0e47f531b0723b0b6fb0721',
  516. '7f0e27f1487f531b0b0bb0b6fb0722',
  517. '7f0e397bd097c35b0b6fc920fb0722',
  518. '977837f0e37f14998082b0787b06bd',
  519. '7f07e7f0e47f531b0723b0b6fb0721',
  520. '7f0e27f1487f531b0b0bb0b6fb0722',
  521. '7f0e397bd07f595b0b0bc920fb0722',
  522. '977837f0e37f14998082b0787b06bd',
  523. '7f07e7f0e47f531b0723b0b6fb0721',
  524. '7f0e27f1487f531b0b0bb0b6fb0722',
  525. '7f0e397bd07f595b0b0bc920fb0722',
  526. '977837f0e37f14998082b0787b06bd',
  527. '7f07e7f0e47f149b0723b0787b0721',
  528. '7f0e27f0e47f531b0b0bb0b6fb0722',
  529. '7f0e397bd07f595b0b0bc920fb0722',
  530. '977837f0e37f14998082b0723b06bd',
  531. '7f07e7f0e37f149b0723b0787b0721',
  532. '7f0e27f0e47f531b0723b0b6fb0722',
  533. '7f0e397bd07f595b0b0bc920fb0722',
  534. '977837f0e37f14898082b0723b02d5',
  535. '7ec967f0e37f14998082b0787b0721',
  536. '7f07e7f0e47f531b0723b0b6fb0722',
  537. '7f0e37f1487f595b0b0bb0b6fb0722',
  538. '7f0e37f0e37f14898082b0723b02d5',
  539. '7ec967f0e37f14998082b0787b0721',
  540. '7f07e7f0e47f531b0723b0b6fb0722',
  541. '7f0e37f1487f531b0b0bb0b6fb0722',
  542. '7f0e37f0e37f14898082b0723b02d5',
  543. '7ec967f0e37f14998082b0787b06bd',
  544. '7f07e7f0e47f531b0723b0b6fb0721',
  545. '7f0e37f1487f531b0b0bb0b6fb0722',
  546. '7f0e37f0e37f14898082b072297c35',
  547. '7ec967f0e37f14998082b0787b06bd',
  548. '7f07e7f0e47f531b0723b0b6fb0721',
  549. '7f0e27f1487f531b0b0bb0b6fb0722',
  550. '7f0e37f0e37f14898082b072297c35',
  551. '7ec967f0e37f14998082b0787b06bd',
  552. '7f07e7f0e47f531b0723b0b6fb0721',
  553. '7f0e27f1487f531b0b0bb0b6fb0722',
  554. '7f0e37f0e366aa89801eb072297c35',
  555. '7ec967f0e37f14998082b0787b06bd',
  556. '7f07e7f0e47f149b0723b0787b0721',
  557. '7f0e27f1487f531b0b0bb0b6fb0722',
  558. '7f0e37f0e366aa89801eb072297c35',
  559. '7ec967f0e37f14998082b0723b06bd',
  560. '7f07e7f0e47f149b0723b0787b0721',
  561. '7f0e27f0e47f531b0723b0b6fb0722',
  562. '7f0e37f0e366aa89801eb072297c35',
  563. '7ec967f0e37f14998082b0723b06bd',
  564. '7f07e7f0e37f14998083b0787b0721',
  565. '7f0e27f0e47f531b0723b0b6fb0722',
  566. '7f0e37f0e366aa89801eb072297c35',
  567. '7ec967f0e37f14898082b0723b02d5',
  568. '7f07e7f0e37f14998082b0787b0721',
  569. '7f07e7f0e47f531b0723b0b6fb0722',
  570. '7f0e36665b66aa89801e9808297c35',
  571. '665f67f0e37f14898082b0723b02d5',
  572. '7ec967f0e37f14998082b0787b0721',
  573. '7f07e7f0e47f531b0723b0b6fb0722',
  574. '7f0e36665b66a449801e9808297c35',
  575. '665f67f0e37f14898082b0723b02d5',
  576. '7ec967f0e37f14998082b0787b06bd',
  577. '7f07e7f0e47f531b0723b0b6fb0721',
  578. '7f0e36665b66a449801e9808297c35',
  579. '665f67f0e37f14898082b072297c35',
  580. '7ec967f0e37f14998082b0787b06bd',
  581. '7f07e7f0e47f531b0723b0b6fb0721',
  582. '7f0e26665b66a449801e9808297c35',
  583. '665f67f0e37f1489801eb072297c35',
  584. '7ec967f0e37f14998082b0787b06bd',
  585. '7f07e7f0e47f531b0723b0b6fb0721',
  586. '7f0e27f1487f531b0b0bb0b6fb0722'
  587. ],
  588. /**
  589. * 数字转中文速查表
  590. * @Array Of Property
  591. * @trans ['日','一','二','三','四','五','六','七','八','九','十']
  592. * @return Cn string
  593. */
  594. nStr1: [
  595. '\u65e5',
  596. '\u4e00',
  597. '\u4e8c',
  598. '\u4e09',
  599. '\u56db',
  600. '\u4e94',
  601. '\u516d',
  602. '\u4e03',
  603. '\u516b',
  604. '\u4e5d',
  605. '\u5341'
  606. ],
  607. /**
  608. * 日期转农历称呼速查表
  609. * @Array Of Property
  610. * @trans ['初','十','廿','卅']
  611. * @return Cn string
  612. */
  613. nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
  614. /**
  615. * 月份转农历称呼速查表
  616. * @Array Of Property
  617. * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
  618. * @return Cn string
  619. */
  620. nStr3: [
  621. '\u6b63',
  622. '\u4e8c',
  623. '\u4e09',
  624. '\u56db',
  625. '\u4e94',
  626. '\u516d',
  627. '\u4e03',
  628. '\u516b',
  629. '\u4e5d',
  630. '\u5341',
  631. '\u51ac',
  632. '\u814a'
  633. ],
  634. /**
  635. * 返回农历y年一整年的总天数
  636. * @param y lunar Year
  637. * @return Number
  638. * @eg:var count = calendar.lYearDays(1987) ;//count=387
  639. */
  640. lYearDays: function (y) {
  641. let i,
  642. sum = 348
  643. for (i = 0x8000; i > 0x8; i >>= 1) {
  644. sum += this.lunarInfo[y - 1900] & i ? 1 : 0
  645. }
  646. return sum + this.leapDays(y)
  647. },
  648. /**
  649. * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
  650. * @param y lunar Year
  651. * @return Number (0-12)
  652. * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
  653. */
  654. leapMonth: function (y) {
  655. //闰字编码 \u95f0
  656. return this.lunarInfo[y - 1900] & 0xf
  657. },
  658. /**
  659. * 返回农历y年闰月的天数 若该年没有闰月则返回0
  660. * @param y lunar Year
  661. * @return Number (0、29、30)
  662. * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
  663. */
  664. leapDays: function (y) {
  665. if (this.leapMonth(y)) {
  666. return this.lunarInfo[y - 1900] & 0x10000 ? 30 : 29
  667. }
  668. return 0
  669. },
  670. /**
  671. * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
  672. * @param y lunar Year
  673. * @param m lunar Month
  674. * @return Number (-1、29、30)
  675. * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
  676. */
  677. monthDays: function (y, m) {
  678. if (m > 12 || m < 1) {
  679. return -1
  680. } //月份参数从1至12,参数错误返回-1
  681. return this.lunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29
  682. },
  683. /**
  684. * 返回公历(!)y年m月的天数
  685. * @param y solar Year
  686. * @param m solar Month
  687. * @return Number (-1、28、29、30、31)
  688. * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
  689. */
  690. solarDays: function (y, m) {
  691. if (m > 12 || m < 1) {
  692. return -1
  693. } //若参数错误 返回-1
  694. const ms = m - 1
  695. if (ms === 1) {
  696. //2月份的闰平规律测算后确认返回28或29
  697. return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0 ? 29 : 28
  698. } else {
  699. return this.solarMonth[ms]
  700. }
  701. },
  702. /**
  703. * 农历年份转换为干支纪年
  704. * @param lYear 农历年的年份数
  705. * @return Cn string
  706. */
  707. toGanZhiYear: function (lYear) {
  708. let ganKey = (lYear - 3) % 10
  709. let zhiKey = (lYear - 3) % 12
  710. if (ganKey === 0) ganKey = 10 //如果余数为0则为最后一个天干
  711. if (zhiKey === 0) zhiKey = 12 //如果余数为0则为最后一个地支
  712. return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
  713. },
  714. /**
  715. * 公历月、日判断所属星座
  716. * @param cMonth [description]
  717. * @param cDay [description]
  718. * @return Cn string
  719. */
  720. toAstro: function (cMonth, cDay) {
  721. const s =
  722. '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
  723. const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
  724. return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7' //座
  725. },
  726. /**
  727. * 传入offset偏移量返回干支
  728. * @param offset 相对甲子的偏移量
  729. * @return Cn string
  730. */
  731. toGanZhi: function (offset) {
  732. return this.Gan[offset % 10] + this.Zhi[offset % 12]
  733. },
  734. /**
  735. * 传入公历(!)y年获得该年第n个节气的公历日期
  736. * @param y y公历年(1900-2100)
  737. * @param n n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
  738. * @return day Number
  739. * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
  740. */
  741. getTerm: function (y, n) {
  742. if (y < 1900 || y > 2100) {
  743. return -1
  744. }
  745. if (n < 1 || n > 24) {
  746. return -1
  747. }
  748. const _table = this.sTermInfo[y - 1900]
  749. const _info = [
  750. parseInt('0x' + _table.substr(0, 5)).toString(),
  751. parseInt('0x' + _table.substr(5, 5)).toString(),
  752. parseInt('0x' + _table.substr(10, 5)).toString(),
  753. parseInt('0x' + _table.substr(15, 5)).toString(),
  754. parseInt('0x' + _table.substr(20, 5)).toString(),
  755. parseInt('0x' + _table.substr(25, 5)).toString()
  756. ]
  757. const _calcDay = [
  758. _info[0].substr(0, 1),
  759. _info[0].substr(1, 2),
  760. _info[0].substr(3, 1),
  761. _info[0].substr(4, 2),
  762. _info[1].substr(0, 1),
  763. _info[1].substr(1, 2),
  764. _info[1].substr(3, 1),
  765. _info[1].substr(4, 2),
  766. _info[2].substr(0, 1),
  767. _info[2].substr(1, 2),
  768. _info[2].substr(3, 1),
  769. _info[2].substr(4, 2),
  770. _info[3].substr(0, 1),
  771. _info[3].substr(1, 2),
  772. _info[3].substr(3, 1),
  773. _info[3].substr(4, 2),
  774. _info[4].substr(0, 1),
  775. _info[4].substr(1, 2),
  776. _info[4].substr(3, 1),
  777. _info[4].substr(4, 2),
  778. _info[5].substr(0, 1),
  779. _info[5].substr(1, 2),
  780. _info[5].substr(3, 1),
  781. _info[5].substr(4, 2)
  782. ]
  783. return parseInt(_calcDay[n - 1])
  784. },
  785. /**
  786. * 传入农历数字月份返回汉语通俗表示法
  787. * @param m lunar month
  788. * @return Cn string
  789. * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
  790. */
  791. toChinaMonth: function (m) {
  792. // 月 => \u6708
  793. if (m > 12 || m < 1) {
  794. return -1
  795. } //若参数错误 返回-1
  796. let s = this.nStr3[m - 1]
  797. s += '\u6708' //加上月字
  798. return s
  799. },
  800. /**
  801. * 传入农历日期数字返回汉字表示法
  802. * @param d lunar day
  803. * @return Cn string
  804. * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
  805. */
  806. toChinaDay: function (d) {
  807. //日 => \u65e5
  808. let s
  809. switch (d) {
  810. case 10:
  811. s = '\u521d\u5341'
  812. break
  813. case 20:
  814. s = '\u4e8c\u5341'
  815. break
  816. case 30:
  817. s = '\u4e09\u5341'
  818. break
  819. default:
  820. s = this.nStr2[Math.floor(d / 10)]
  821. s += this.nStr1[d % 10]
  822. }
  823. return s
  824. },
  825. /**
  826. * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
  827. * @param y year
  828. * @return Cn string
  829. * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
  830. */
  831. getAnimal: function (y) {
  832. return this.Animals[(y - 4) % 12]
  833. },
  834. /**
  835. * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
  836. * !important! 公历参数区间1900.1.31~2100.12.31
  837. * @param yPara solar year
  838. * @param mPara solar month
  839. * @param dPara solar day
  840. * @return JSON object
  841. * @eg:console.log(calendar.solar2lunar(1987,11,01));
  842. */
  843. solar2lunar: function (yPara, mPara, dPara) {
  844. let y = parseInt(yPara)
  845. let m = parseInt(mPara)
  846. let d = parseInt(dPara)
  847. //年份限定、上限
  848. if (y < 1900 || y > 2100) {
  849. return -1 // undefined转换为数字变为NaN
  850. }
  851. //公历传参最下限
  852. if (y === 1900 && m === 1 && d < 31) {
  853. return -1
  854. }
  855. //未传参 获得当天
  856. let objDate
  857. if (!y) {
  858. objDate = new Date()
  859. } else {
  860. objDate = new Date(y, parseInt(m.toString()) - 1, d)
  861. }
  862. let i,
  863. leap = 0,
  864. temp = 0
  865. //修正ymd参数
  866. y = objDate.getFullYear()
  867. m = objDate.getMonth() + 1
  868. d = objDate.getDate()
  869. let offset =
  870. (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) -
  871. Date.UTC(1900, 0, 31)) /
  872. 86400000
  873. for (i = 1900; i < 2101 && offset > 0; i++) {
  874. temp = this.lYearDays(i)
  875. offset -= temp
  876. }
  877. if (offset < 0) {
  878. offset += temp
  879. i--
  880. }
  881. //是否今天
  882. // eslint-disable-next-line prefer-const
  883. let isTodayObj = new Date(),
  884. isToday = false
  885. if (
  886. isTodayObj.getFullYear() === y &&
  887. isTodayObj.getMonth() + 1 === m &&
  888. isTodayObj.getDate() === d
  889. ) {
  890. isToday = true
  891. }
  892. //星期几
  893. let nWeek = objDate.getDay(),
  894. // eslint-disable-next-line prefer-const
  895. cWeek = this.nStr1[nWeek]
  896. //数字表示周几顺应天朝周一开始的惯例
  897. if (nWeek === 0) {
  898. nWeek = 7
  899. }
  900. //农历年
  901. const year = i
  902. leap = this.leapMonth(i) //闰哪个月
  903. let isLeap = false
  904. //效验闰月
  905. for (i = 1; i < 13 && offset > 0; i++) {
  906. //闰月
  907. if (leap > 0 && i === leap + 1 && isLeap === false) {
  908. --i
  909. isLeap = true
  910. temp = this.leapDays(year) //计算农历闰月天数
  911. } else {
  912. temp = this.monthDays(year, i) //计算农历普通月天数
  913. }
  914. //解除闰月
  915. if (isLeap === true && i === leap + 1) {
  916. isLeap = false
  917. }
  918. offset -= temp
  919. }
  920. // 闰月导致数组下标重叠取反
  921. if (offset === 0 && leap > 0 && i === leap + 1) {
  922. if (isLeap) {
  923. isLeap = false
  924. } else {
  925. isLeap = true
  926. --i
  927. }
  928. }
  929. if (offset < 0) {
  930. offset += temp
  931. --i
  932. }
  933. //农历月
  934. const month = i
  935. //农历日
  936. const day = offset + 1
  937. //天干地支处理
  938. const sm = m - 1
  939. const gzY = this.toGanZhiYear(year)
  940. // 当月的两个节气
  941. // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
  942. const firstNode = this.getTerm(y, m * 2 - 1) //返回当月「节」为几日开始
  943. const secondNode = this.getTerm(y, m * 2) //返回当月「节」为几日开始
  944. // 依据12节气修正干支月
  945. let gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
  946. if (d >= firstNode) {
  947. gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
  948. }
  949. //传入的日期的节气与否
  950. let isTerm = false
  951. let Term = null
  952. if (firstNode === d) {
  953. isTerm = true
  954. Term = this.solarTerm[m * 2 - 2]
  955. }
  956. if (secondNode === d) {
  957. isTerm = true
  958. Term = this.solarTerm[m * 2 - 1]
  959. }
  960. //日柱 当月一日与 1900/1/1 相差天数
  961. const dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
  962. const gzD = this.toGanZhi(dayCyclical + d - 1)
  963. //该日期所属的星座
  964. const astro = this.toAstro(m, d)
  965. const solarDate = y + '-' + m + '-' + d
  966. const lunarDate = year + '-' + month + '-' + day
  967. const festival = this.festival
  968. const lFestival = this.lFestival
  969. const festivalDate = m + '-' + d
  970. const lunarFestivalDate = month + '-' + day
  971. return {
  972. date: solarDate,
  973. lunarDate: lunarDate,
  974. festival: festival[festivalDate] ? festival[festivalDate].title : null,
  975. lunarFestival: lFestival[lunarFestivalDate] ? lFestival[lunarFestivalDate].title : null,
  976. lYear: year,
  977. lMonth: month,
  978. lDay: day,
  979. Animal: this.getAnimal(year),
  980. IMonthCn: (isLeap ? '\u95f0' : '') + this.toChinaMonth(month),
  981. IDayCn: this.toChinaDay(day),
  982. cYear: y,
  983. cMonth: m,
  984. cDay: d,
  985. gzYear: gzY,
  986. gzMonth: gzM,
  987. gzDay: gzD,
  988. isToday: isToday,
  989. isLeap: isLeap,
  990. nWeek: nWeek,
  991. ncWeek: '\u661f\u671f' + cWeek,
  992. isTerm: isTerm,
  993. Term: Term,
  994. astro: astro
  995. }
  996. },
  997. /**
  998. * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
  999. * !important! 参数区间1900.1.31~2100.12.1
  1000. * @param y lunar year
  1001. * @param m lunar month
  1002. * @param d lunar day
  1003. * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
  1004. * @return JSON object
  1005. * @eg:console.log(calendar.lunar2solar(1987,9,10));
  1006. */
  1007. lunar2solar: function (y, m, d, isLeapMonth) {
  1008. y = parseInt(y)
  1009. m = parseInt(m)
  1010. d = parseInt(d)
  1011. isLeapMonth = !!isLeapMonth
  1012. // const leapOffset = 0;
  1013. const leapMonth = this.leapMonth(y)
  1014. // const leapDay = this.leapDays(y);
  1015. if (isLeapMonth && leapMonth !== m) {
  1016. return -1
  1017. } //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
  1018. if ((y === 2100 && m === 12 && d > 1) || (y === 1900 && m === 1 && d < 31)) {
  1019. return -1
  1020. } //超出了最大极限值
  1021. const day = this.monthDays(y, m)
  1022. let _day = day
  1023. //bugFix 2016-9-25
  1024. //if month is leap, _day use leapDays method
  1025. if (isLeapMonth) {
  1026. _day = this.leapDays(y, m)
  1027. }
  1028. if (y < 1900 || y > 2100 || d > _day) {
  1029. return -1
  1030. } //参数合法性效验
  1031. //计算农历的时间差
  1032. let offset = 0
  1033. let i
  1034. for (i = 1900; i < y; i++) {
  1035. offset += this.lYearDays(i)
  1036. }
  1037. let leap = 0,
  1038. isAdd = false
  1039. for (i = 1; i < m; i++) {
  1040. leap = this.leapMonth(y)
  1041. if (!isAdd) {
  1042. //处理闰月
  1043. if (leap <= i && leap > 0) {
  1044. offset += this.leapDays(y)
  1045. isAdd = true
  1046. }
  1047. }
  1048. offset += this.monthDays(y, i)
  1049. }
  1050. //转换闰月农历 需补充该年闰月的前一个月的时差
  1051. if (isLeapMonth) {
  1052. offset += day
  1053. }
  1054. //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
  1055. const strap = Date.UTC(1900, 1, 30, 0, 0, 0)
  1056. const calObj = new Date((offset + d - 31) * 86400000 + strap)
  1057. const cY = calObj.getUTCFullYear()
  1058. const cM = calObj.getUTCMonth() + 1
  1059. const cD = calObj.getUTCDate()
  1060. return this.solar2lunar(cY, cM, cD)
  1061. }
  1062. }
  1063. export default lunar