1
Showing
6 changed files
with
638 additions
and
2 deletions
... | @@ -5,6 +5,7 @@ import { | ... | @@ -5,6 +5,7 @@ import { |
5 | } from '@/api/fetch-api.js' | 5 | } from '@/api/fetch-api.js' |
6 | 6 | ||
7 | import Date from '@/utils/date.js'; | 7 | import Date from '@/utils/date.js'; |
8 | import { toSolar } from '@/utils/lunar.js'; | ||
8 | 9 | ||
9 | import { | 10 | import { |
10 | ddMMyyyy2yyyyMMdd | 11 | ddMMyyyy2yyyyMMdd |
... | @@ -100,6 +101,16 @@ export default { | ... | @@ -100,6 +101,16 @@ export default { |
100 | // 用户渲染的数据 | 101 | // 用户渲染的数据 |
101 | fortmatMonthData: [], | 102 | fortmatMonthData: [], |
102 | visible: false, | 103 | visible: false, |
104 | hkHolidayDefine: { | ||
105 | // 公历假期,缺少复活节,缺少聖誕節後第一個周日 | ||
106 | gl: [[1, 1], [4, 10], [4, 11], [4, 30], [5, 1], [7, 1], [10, 1], [10, 2], [12, 25]], | ||
107 | // 农历假期,缺少清明节 | ||
108 | nl: [[1, 1], [1, 2], [1, 3], [5, 5], [8, 15], [9, 9]] | ||
109 | }, | ||
110 | // 节假日,key是月份,value是日期列表 | ||
111 | holiday: { | ||
112 | |||
113 | } | ||
103 | } | 114 | } |
104 | }, | 115 | }, |
105 | components: {}, | 116 | components: {}, |
... | @@ -201,6 +212,16 @@ export default { | ... | @@ -201,6 +212,16 @@ export default { |
201 | nowDate.setHours(0, 0, 0, 0); | 212 | nowDate.setHours(0, 0, 0, 0); |
202 | disable = buildDate.getTime() == nowDate.getTime(); | 213 | disable = buildDate.getTime() == nowDate.getTime(); |
203 | } | 214 | } |
215 | if (!disable && this.filtModel.indexOf("holiday") >= 0) { | ||
216 | if (isWeekend) { | ||
217 | disable = true; | ||
218 | } else { | ||
219 | let holidayCandidates = this.holiday[month+""]; | ||
220 | if (holidayCandidates && holidayCandidates.indexOf(d) >= 0) { | ||
221 | disable = true; | ||
222 | } | ||
223 | } | ||
224 | } | ||
204 | if (!disable && this.filtModel.indexOf("history") >= 0) { | 225 | if (!disable && this.filtModel.indexOf("history") >= 0) { |
205 | buildDate.setHours(23, 59, 59, 999); | 226 | buildDate.setHours(23, 59, 59, 999); |
206 | disable = buildDate.getTime() < nowDate.getTime() | 227 | disable = buildDate.getTime() < nowDate.getTime() |
... | @@ -510,6 +531,70 @@ export default { | ... | @@ -510,6 +531,70 @@ export default { |
510 | }, | 531 | }, |
511 | judgeLastDateValidate(val) { | 532 | judgeLastDateValidate(val) { |
512 | 533 | ||
534 | }, | ||
535 | calculateHolidays() { | ||
536 | // 计算新历 | ||
537 | let result = {}; | ||
538 | let year = this.year; | ||
539 | if (!year) { | ||
540 | return; | ||
541 | } | ||
542 | let hkHolidayDefine = this.hkHolidayDefine; | ||
543 | for (let index = 0; index < hkHolidayDefine.gl.length; index++) { | ||
544 | let m = hkHolidayDefine.gl[index][0]; | ||
545 | let d = hkHolidayDefine.gl[index][1]; | ||
546 | |||
547 | // 如果是周六/周日,顺延到下周一 | ||
548 | let date = Date.parse(`${year}.${m}.${d}`); | ||
549 | if (date.getDay() == 6) { | ||
550 | // 周六 | ||
551 | date.addDays(2); | ||
552 | } else if (date.getDay() == 0) { | ||
553 | date.addDays(1); | ||
554 | } | ||
555 | m = date.getMonth() + 1; | ||
556 | d = date.getDate(); | ||
557 | |||
558 | let list = result[m]; | ||
559 | if (!list) { | ||
560 | result[m] = []; | ||
561 | list = result[m]; | ||
562 | } | ||
563 | list.push(d); | ||
564 | } | ||
565 | |||
566 | |||
567 | for (let index = 0; index < hkHolidayDefine.nl.length; index++) { | ||
568 | let m = hkHolidayDefine.nl[index][0]; | ||
569 | let d = hkHolidayDefine.nl[index][1]; | ||
570 | let gl = toSolar(year, m, d); | ||
571 | |||
572 | m = gl[1]; | ||
573 | d = gl[2]; | ||
574 | |||
575 | // 如果是周六/周日,顺延到下周一 | ||
576 | let date = Date.parse(`${year}.${m}.${d}`); | ||
577 | |||
578 | if (date.getDay() == 6) { | ||
579 | // 周六 | ||
580 | date.addDays(2); | ||
581 | } else if (date.getDay() == 0) { | ||
582 | date.addDays(1); | ||
583 | } | ||
584 | m = date.getMonth() + 1; | ||
585 | d = date.getDate(); | ||
586 | |||
587 | let list = result[m]; | ||
588 | if (!list) { | ||
589 | result[m] = []; | ||
590 | list = result[m]; | ||
591 | } | ||
592 | list.push(d); | ||
593 | } | ||
594 | |||
595 | this.holiday = result; | ||
596 | console.log(JSON.stringify(this.holiday)); | ||
597 | |||
513 | } | 598 | } |
514 | }, | 599 | }, |
515 | mounted() { }, | 600 | mounted() { }, |
... | @@ -524,6 +609,9 @@ export default { | ... | @@ -524,6 +609,9 @@ export default { |
524 | dateValue(val, oldVal) { | 609 | dateValue(val, oldVal) { |
525 | this.checkDateValue(); | 610 | this.checkDateValue(); |
526 | this.$emit('input', val); | 611 | this.$emit('input', val); |
612 | }, | ||
613 | year() { | ||
614 | this.calculateHolidays(); | ||
527 | } | 615 | } |
528 | } | 616 | } |
529 | } | 617 | } | ... | ... |
... | @@ -95,6 +95,7 @@ export default { | ... | @@ -95,6 +95,7 @@ export default { |
95 | } | 95 | } |
96 | }, | 96 | }, |
97 | logoutHandler() { | 97 | logoutHandler() { |
98 | this.clearCache(); | ||
98 | httpPost({ | 99 | httpPost({ |
99 | url: api.logout | 100 | url: api.logout |
100 | }).then(() => { | 101 | }).then(() => { |
... | @@ -102,6 +103,12 @@ export default { | ... | @@ -102,6 +103,12 @@ export default { |
102 | this.showLogoutTip(); | 103 | this.showLogoutTip(); |
103 | }); | 104 | }); |
104 | }, | 105 | }, |
106 | clearCache() { | ||
107 | for (let index = 0; index < sessionStorage.length; index++) { | ||
108 | let key = sessionStorage.key(index); | ||
109 | sessionStorage.removeItem(key); | ||
110 | } | ||
111 | }, | ||
105 | // 点击item | 112 | // 点击item |
106 | onChangeHandler(evt) { | 113 | onChangeHandler(evt) { |
107 | this.activeIndex = evt; | 114 | this.activeIndex = evt; | ... | ... |
... | @@ -84,7 +84,7 @@ | ... | @@ -84,7 +84,7 @@ |
84 | </div> | 84 | </div> |
85 | <div class="ipt-wrap ipt-wrap2"> | 85 | <div class="ipt-wrap ipt-wrap2"> |
86 | <!-- <input class="ipt" type="date" :class="{err:errorTips.contactDateErr.length>0}" v-model="data.contactDate"> --> | 86 | <!-- <input class="ipt" type="date" :class="{err:errorTips.contactDateErr.length>0}" v-model="data.contactDate"> --> |
87 | <date-picker v-model="data.contactDate" :check="checkDate"></date-picker> | 87 | <date-picker v-model="data.contactDate" :check="checkDate" :filtModel="['history','holiday']"></date-picker> |
88 | </div> | 88 | </div> |
89 | <div class="validator" v-if="errorTips.contactDateErr.length > 0"> | 89 | <div class="validator" v-if="errorTips.contactDateErr.length > 0"> |
90 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.contactDateErr}} | 90 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.contactDateErr}} | ... | ... |
... | @@ -122,6 +122,9 @@ export default { | ... | @@ -122,6 +122,9 @@ export default { |
122 | initData() { | 122 | initData() { |
123 | httpPost({ url: api.profile, sid: true }).then(content => { | 123 | httpPost({ url: api.profile, sid: true }).then(content => { |
124 | if (content) { | 124 | if (content) { |
125 | if (content.birthDate.indexOf(" ") > 0) { | ||
126 | content.birthDate = content.birthDate.split(" ")[0]; | ||
127 | } | ||
125 | this.information = content; | 128 | this.information = content; |
126 | if (content && content.birthDate) { | 129 | if (content && content.birthDate) { |
127 | this.birthDate = content.birthDate; | 130 | this.birthDate = content.birthDate; | ... | ... |
src/utils/lunar.js
0 → 100644
1 | |||
2 | var calendar = { | ||
3 | |||
4 | /** | ||
5 | * 农历1900-2100的润大小信息表 | ||
6 | * @Array Of Property | ||
7 | * @return Hex | ||
8 | */ | ||
9 | lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909 | ||
10 | 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919 | ||
11 | 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929 | ||
12 | 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939 | ||
13 | 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949 | ||
14 | 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959 | ||
15 | 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969 | ||
16 | 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979 | ||
17 | 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989 | ||
18 | 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999 | ||
19 | 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009 | ||
20 | 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019 | ||
21 | 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029 | ||
22 | 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039 | ||
23 | 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049 | ||
24 | 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059 | ||
25 | 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069 | ||
26 | 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079 | ||
27 | 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089 | ||
28 | 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099 | ||
29 | 0x0d520],//2100 | ||
30 | |||
31 | /** | ||
32 | * 公历每个月份的天数普通表 | ||
33 | * @Array Of Property | ||
34 | * @return Number | ||
35 | */ | ||
36 | solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], | ||
37 | |||
38 | /** | ||
39 | * 天干地支之天干速查表 | ||
40 | * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] | ||
41 | * @return Cn string | ||
42 | */ | ||
43 | Gan: ["\u7532", "\u4e59", "\u4e19", "\u4e01", "\u620a", "\u5df1", "\u5e9a", "\u8f9b", "\u58ec", "\u7678"], | ||
44 | |||
45 | /** | ||
46 | * 天干地支之地支速查表 | ||
47 | * @Array Of Property | ||
48 | * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] | ||
49 | * @return Cn string | ||
50 | */ | ||
51 | Zhi: ["\u5b50", "\u4e11", "\u5bc5", "\u536f", "\u8fb0", "\u5df3", "\u5348", "\u672a", "\u7533", "\u9149", "\u620c", "\u4ea5"], | ||
52 | |||
53 | /** | ||
54 | * 天干地支之地支速查表<=>生肖 | ||
55 | * @Array Of Property | ||
56 | * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] | ||
57 | * @return Cn string | ||
58 | */ | ||
59 | Animals: ["\u9f20", "\u725b", "\u864e", "\u5154", "\u9f99", "\u86c7", "\u9a6c", "\u7f8a", "\u7334", "\u9e21", "\u72d7", "\u732a"], | ||
60 | |||
61 | /** | ||
62 | * 24节气速查表 | ||
63 | * @Array Of Property | ||
64 | * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] | ||
65 | * @return Cn string | ||
66 | */ | ||
67 | solarTerm: ["\u5c0f\u5bd2", "\u5927\u5bd2", "\u7acb\u6625", "\u96e8\u6c34", "\u60ca\u86f0", "\u6625\u5206", "\u6e05\u660e", "\u8c37\u96e8", "\u7acb\u590f", "\u5c0f\u6ee1", "\u8292\u79cd", "\u590f\u81f3", "\u5c0f\u6691", "\u5927\u6691", "\u7acb\u79cb", "\u5904\u6691", "\u767d\u9732", "\u79cb\u5206", "\u5bd2\u9732", "\u971c\u964d", "\u7acb\u51ac", "\u5c0f\u96ea", "\u5927\u96ea", "\u51ac\u81f3"], | ||
68 | |||
69 | /** | ||
70 | * 1900-2100各年的24节气日期速查表 | ||
71 | * @Array Of Property | ||
72 | * @return 0x string For splice | ||
73 | */ | ||
74 | sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', | ||
75 | '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', | ||
76 | '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', | ||
77 | '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', | ||
78 | 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', | ||
79 | '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', | ||
80 | '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', | ||
81 | '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', | ||
82 | '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', | ||
83 | '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', | ||
84 | '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', | ||
85 | '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', | ||
86 | '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', | ||
87 | '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', | ||
88 | '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', | ||
89 | '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', | ||
90 | '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', | ||
91 | '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', | ||
92 | '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', | ||
93 | '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', | ||
94 | '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', | ||
95 | '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', | ||
96 | '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', | ||
97 | '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', | ||
98 | '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', | ||
99 | '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', | ||
100 | '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', | ||
101 | '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', | ||
102 | '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', | ||
103 | '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', | ||
104 | '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', | ||
105 | '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', | ||
106 | '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', | ||
107 | '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', | ||
108 | '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', | ||
109 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', | ||
110 | '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', | ||
111 | '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', | ||
112 | '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', | ||
113 | '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', | ||
114 | '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', | ||
115 | '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', | ||
116 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', | ||
117 | '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', | ||
118 | '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', | ||
119 | '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', | ||
120 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', | ||
121 | '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', | ||
122 | '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', | ||
123 | '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', | ||
124 | '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', | ||
125 | '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', | ||
126 | '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', | ||
127 | '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', | ||
128 | '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', | ||
129 | '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', | ||
130 | '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', | ||
131 | '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', | ||
132 | '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', | ||
133 | '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', | ||
134 | '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', | ||
135 | '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', | ||
136 | '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', | ||
137 | '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', | ||
138 | '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', | ||
139 | '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', | ||
140 | '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], | ||
141 | |||
142 | /** | ||
143 | * 数字转中文速查表 | ||
144 | * @Array Of Property | ||
145 | * @trans ['日','一','二','三','四','五','六','七','八','九','十'] | ||
146 | * @return Cn string | ||
147 | */ | ||
148 | nStr1: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341"], | ||
149 | |||
150 | /** | ||
151 | * 日期转农历称呼速查表 | ||
152 | * @Array Of Property | ||
153 | * @trans ['初','十','廿','卅'] | ||
154 | * @return Cn string | ||
155 | */ | ||
156 | nStr2: ["\u521d", "\u5341", "\u5eff", "\u5345"], | ||
157 | |||
158 | /** | ||
159 | * 月份转农历称呼速查表 | ||
160 | * @Array Of Property | ||
161 | * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] | ||
162 | * @return Cn string | ||
163 | */ | ||
164 | nStr3: ["\u6b63", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341", "\u51ac", "\u814a"], | ||
165 | |||
166 | /** | ||
167 | * 返回农历y年一整年的总天数 | ||
168 | * @param lunar Year | ||
169 | * @return Number | ||
170 | * @eg:var count = calendar.lYearDays(1987) ;//count=387 | ||
171 | */ | ||
172 | lYearDays: function (y) { | ||
173 | var i, sum = 348; | ||
174 | for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0; } | ||
175 | return (sum + this.leapDays(y)); | ||
176 | }, | ||
177 | |||
178 | /** | ||
179 | * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 | ||
180 | * @param lunar Year | ||
181 | * @return Number (0-12) | ||
182 | * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 | ||
183 | */ | ||
184 | leapMonth: function (y) { //闰字编码 \u95f0 | ||
185 | return (this.lunarInfo[y - 1900] & 0xf); | ||
186 | }, | ||
187 | |||
188 | /** | ||
189 | * 返回农历y年闰月的天数 若该年没有闰月则返回0 | ||
190 | * @param lunar Year | ||
191 | * @return Number (0、29、30) | ||
192 | * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 | ||
193 | */ | ||
194 | leapDays: function (y) { | ||
195 | if (this.leapMonth(y)) { | ||
196 | return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29); | ||
197 | } | ||
198 | return (0); | ||
199 | }, | ||
200 | |||
201 | /** | ||
202 | * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 | ||
203 | * @param lunar Year | ||
204 | * @return Number (-1、29、30) | ||
205 | * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 | ||
206 | */ | ||
207 | monthDays: function (y, m) { | ||
208 | if (m > 12 || m < 1) { return -1 }//月份参数从1至12,参数错误返回-1 | ||
209 | return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29); | ||
210 | }, | ||
211 | |||
212 | /** | ||
213 | * 返回公历(!)y年m月的天数 | ||
214 | * @param solar Year | ||
215 | * @return Number (-1、28、29、30、31) | ||
216 | * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 | ||
217 | */ | ||
218 | solarDays: function (y, m) { | ||
219 | if (m > 12 || m < 1) { return -1 } //若参数错误 返回-1 | ||
220 | var ms = m - 1; | ||
221 | if (ms == 1) { //2月份的闰平规律测算后确认返回28或29 | ||
222 | return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28); | ||
223 | } else { | ||
224 | return (this.solarMonth[ms]); | ||
225 | } | ||
226 | }, | ||
227 | |||
228 | /** | ||
229 | * 农历年份转换为干支纪年 | ||
230 | * @param lYear 农历年的年份数 | ||
231 | * @return Cn string | ||
232 | */ | ||
233 | toGanZhiYear: function (lYear) { | ||
234 | var ganKey = (lYear - 3) % 10; | ||
235 | var zhiKey = (lYear - 3) % 12; | ||
236 | if (ganKey == 0) ganKey = 10;//如果余数为0则为最后一个天干 | ||
237 | if (zhiKey == 0) zhiKey = 12;//如果余数为0则为最后一个地支 | ||
238 | return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]; | ||
239 | |||
240 | }, | ||
241 | |||
242 | /** | ||
243 | * 公历月、日判断所属星座 | ||
244 | * @param cMonth [description] | ||
245 | * @param cDay [description] | ||
246 | * @return Cn string | ||
247 | */ | ||
248 | toAstro: function (cMonth, cDay) { | ||
249 | var s = "\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"; | ||
250 | var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]; | ||
251 | return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7";//座 | ||
252 | }, | ||
253 | |||
254 | /** | ||
255 | * 传入offset偏移量返回干支 | ||
256 | * @param offset 相对甲子的偏移量 | ||
257 | * @return Cn string | ||
258 | */ | ||
259 | toGanZhi: function (offset) { | ||
260 | return this.Gan[offset % 10] + this.Zhi[offset % 12]; | ||
261 | }, | ||
262 | |||
263 | /** | ||
264 | * 传入公历(!)y年获得该年第n个节气的公历日期 | ||
265 | * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 | ||
266 | * @return day Number | ||
267 | * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 | ||
268 | */ | ||
269 | getTerm: function (y, n) { | ||
270 | if (y < 1900 || y > 2100) { return -1; } | ||
271 | if (n < 1 || n > 24) { return -1; } | ||
272 | var _table = this.sTermInfo[y - 1900]; | ||
273 | var _info = [ | ||
274 | parseInt('0x' + _table.substr(0, 5)).toString(), | ||
275 | parseInt('0x' + _table.substr(5, 5)).toString(), | ||
276 | parseInt('0x' + _table.substr(10, 5)).toString(), | ||
277 | parseInt('0x' + _table.substr(15, 5)).toString(), | ||
278 | parseInt('0x' + _table.substr(20, 5)).toString(), | ||
279 | parseInt('0x' + _table.substr(25, 5)).toString() | ||
280 | ]; | ||
281 | var _calday = [ | ||
282 | _info[0].substr(0, 1), | ||
283 | _info[0].substr(1, 2), | ||
284 | _info[0].substr(3, 1), | ||
285 | _info[0].substr(4, 2), | ||
286 | |||
287 | _info[1].substr(0, 1), | ||
288 | _info[1].substr(1, 2), | ||
289 | _info[1].substr(3, 1), | ||
290 | _info[1].substr(4, 2), | ||
291 | |||
292 | _info[2].substr(0, 1), | ||
293 | _info[2].substr(1, 2), | ||
294 | _info[2].substr(3, 1), | ||
295 | _info[2].substr(4, 2), | ||
296 | |||
297 | _info[3].substr(0, 1), | ||
298 | _info[3].substr(1, 2), | ||
299 | _info[3].substr(3, 1), | ||
300 | _info[3].substr(4, 2), | ||
301 | |||
302 | _info[4].substr(0, 1), | ||
303 | _info[4].substr(1, 2), | ||
304 | _info[4].substr(3, 1), | ||
305 | _info[4].substr(4, 2), | ||
306 | |||
307 | _info[5].substr(0, 1), | ||
308 | _info[5].substr(1, 2), | ||
309 | _info[5].substr(3, 1), | ||
310 | _info[5].substr(4, 2), | ||
311 | ]; | ||
312 | return parseInt(_calday[n - 1]); | ||
313 | }, | ||
314 | |||
315 | /** | ||
316 | * 传入农历数字月份返回汉语通俗表示法 | ||
317 | * @param lunar month | ||
318 | * @return Cn string | ||
319 | * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' | ||
320 | */ | ||
321 | toChinaMonth: function (m) { // 月 => \u6708 | ||
322 | if (m > 12 || m < 1) { return -1 } //若参数错误 返回-1 | ||
323 | var s = this.nStr3[m - 1]; | ||
324 | s += "\u6708";//加上月字 | ||
325 | return s; | ||
326 | }, | ||
327 | |||
328 | /** | ||
329 | * 传入农历日期数字返回汉字表示法 | ||
330 | * @param lunar day | ||
331 | * @return Cn string | ||
332 | * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' | ||
333 | */ | ||
334 | toChinaDay: function (d) { //日 => \u65e5 | ||
335 | var s; | ||
336 | switch (d) { | ||
337 | case 10: | ||
338 | s = '\u521d\u5341'; break; | ||
339 | case 20: | ||
340 | s = '\u4e8c\u5341'; break; | ||
341 | break; | ||
342 | case 30: | ||
343 | s = '\u4e09\u5341'; break; | ||
344 | break; | ||
345 | default: | ||
346 | s = this.nStr2[Math.floor(d / 10)]; | ||
347 | s += this.nStr1[d % 10]; | ||
348 | } | ||
349 | return (s); | ||
350 | }, | ||
351 | |||
352 | /** | ||
353 | * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” | ||
354 | * @param y year | ||
355 | * @return Cn string | ||
356 | * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' | ||
357 | */ | ||
358 | getAnimal: function (y) { | ||
359 | return this.Animals[(y - 4) % 12] | ||
360 | }, | ||
361 | |||
362 | /** | ||
363 | * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON | ||
364 | * @param y solar year | ||
365 | * @param m solar month | ||
366 | * @param d solar day | ||
367 | * @return JSON object | ||
368 | * @eg:console.log(calendar.solar2lunar(1987,11,01)); | ||
369 | */ | ||
370 | solar2lunar: function (y, m, d) { //参数区间1900.1.31~2100.12.31 | ||
371 | //年份限定、上限 | ||
372 | if (y < 1900 || y > 2100) { | ||
373 | return -1;// undefined转换为数字变为NaN | ||
374 | } | ||
375 | //公历传参最下限 | ||
376 | if (y == 1900 && m == 1 && d < 31) { | ||
377 | return -1; | ||
378 | } | ||
379 | //未传参 获得当天 | ||
380 | if (!y) { | ||
381 | var objDate = new Date(); | ||
382 | } else { | ||
383 | var objDate = new Date(y, parseInt(m) - 1, d) | ||
384 | } | ||
385 | var i, leap = 0, temp = 0; | ||
386 | //修正ymd参数 | ||
387 | var y = objDate.getFullYear(), | ||
388 | m = objDate.getMonth() + 1, | ||
389 | d = objDate.getDate(); | ||
390 | var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000; | ||
391 | for (i = 1900; i < 2101 && offset > 0; i++) { | ||
392 | temp = this.lYearDays(i); | ||
393 | offset -= temp; | ||
394 | } | ||
395 | if (offset < 0) { | ||
396 | offset += temp; i--; | ||
397 | } | ||
398 | |||
399 | //是否今天 | ||
400 | var isTodayObj = new Date(), | ||
401 | isToday = false; | ||
402 | if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { | ||
403 | isToday = true; | ||
404 | } | ||
405 | //星期几 | ||
406 | var nWeek = objDate.getDay(), | ||
407 | cWeek = this.nStr1[nWeek]; | ||
408 | //数字表示周几顺应天朝周一开始的惯例 | ||
409 | if (nWeek == 0) { | ||
410 | nWeek = 7; | ||
411 | } | ||
412 | //农历年 | ||
413 | var year = i; | ||
414 | var leap = this.leapMonth(i); //闰哪个月 | ||
415 | var isLeap = false; | ||
416 | |||
417 | //效验闰月 | ||
418 | for (i = 1; i < 13 && offset > 0; i++) { | ||
419 | //闰月 | ||
420 | if (leap > 0 && i == (leap + 1) && isLeap == false) { | ||
421 | --i; | ||
422 | isLeap = true; temp = this.leapDays(year); //计算农历闰月天数 | ||
423 | } | ||
424 | else { | ||
425 | temp = this.monthDays(year, i);//计算农历普通月天数 | ||
426 | } | ||
427 | //解除闰月 | ||
428 | if (isLeap == true && i == (leap + 1)) { isLeap = false; } | ||
429 | offset -= temp; | ||
430 | } | ||
431 | // 闰月导致数组下标重叠取反 | ||
432 | if (offset == 0 && leap > 0 && i == leap + 1) { | ||
433 | if (isLeap) { | ||
434 | isLeap = false; | ||
435 | } else { | ||
436 | isLeap = true; --i; | ||
437 | } | ||
438 | } | ||
439 | if (offset < 0) { | ||
440 | offset += temp; --i; | ||
441 | } | ||
442 | //农历月 | ||
443 | var month = i; | ||
444 | //农历日 | ||
445 | var day = offset + 1; | ||
446 | //天干地支处理 | ||
447 | var sm = m - 1; | ||
448 | var gzY = this.toGanZhiYear(year); | ||
449 | |||
450 | // 当月的两个节气 | ||
451 | // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` | ||
452 | var firstNode = this.getTerm(y, (m * 2 - 1));//返回当月「节」为几日开始 | ||
453 | var secondNode = this.getTerm(y, (m * 2));//返回当月「节」为几日开始 | ||
454 | |||
455 | // 依据12节气修正干支月 | ||
456 | var gzM = this.toGanZhi((y - 1900) * 12 + m + 11); | ||
457 | if (d >= firstNode) { | ||
458 | gzM = this.toGanZhi((y - 1900) * 12 + m + 12); | ||
459 | } | ||
460 | |||
461 | //传入的日期的节气与否 | ||
462 | var isTerm = false; | ||
463 | var Term = null; | ||
464 | if (firstNode == d) { | ||
465 | isTerm = true; | ||
466 | Term = this.solarTerm[m * 2 - 2]; | ||
467 | } | ||
468 | if (secondNode == d) { | ||
469 | isTerm = true; | ||
470 | Term = this.solarTerm[m * 2 - 1]; | ||
471 | } | ||
472 | //日柱 当月一日与 1900/1/1 相差天数 | ||
473 | var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10; | ||
474 | var gzD = this.toGanZhi(dayCyclical + d - 1); | ||
475 | //该日期所属的星座 | ||
476 | var astro = this.toAstro(m, d); | ||
477 | |||
478 | return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? "\u95f0" : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': "\u661f\u671f" + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }; | ||
479 | }, | ||
480 | |||
481 | /** | ||
482 | * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON | ||
483 | * @param y lunar year | ||
484 | * @param m lunar month | ||
485 | * @param d lunar day | ||
486 | * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] | ||
487 | * @return JSON object | ||
488 | * @eg:console.log(calendar.lunar2solar(1987,9,10)); | ||
489 | */ | ||
490 | lunar2solar: function (y, m, d, isLeapMonth) { //参数区间1900.1.31~2100.12.1 | ||
491 | var isLeapMonth = !!isLeapMonth; | ||
492 | var leapOffset = 0; | ||
493 | var leapMonth = this.leapMonth(y); | ||
494 | var leapDay = this.leapDays(y); | ||
495 | if (isLeapMonth && (leapMonth != m)) { return -1; }//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 | ||
496 | if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1; }//超出了最大极限值 | ||
497 | var day = this.monthDays(y, m); | ||
498 | var _day = day; | ||
499 | //bugFix 2016-9-25 | ||
500 | //if month is leap, _day use leapDays method | ||
501 | if (isLeapMonth) { | ||
502 | _day = this.leapDays(y, m); | ||
503 | } | ||
504 | if (y < 1900 || y > 2100 || d > _day) { return -1; }//参数合法性效验 | ||
505 | |||
506 | //计算农历的时间差 | ||
507 | var offset = 0; | ||
508 | for (var i = 1900; i < y; i++) { | ||
509 | offset += this.lYearDays(i); | ||
510 | } | ||
511 | var leap = 0, isAdd = false; | ||
512 | for (var i = 1; i < m; i++) { | ||
513 | leap = this.leapMonth(y); | ||
514 | if (!isAdd) {//处理闰月 | ||
515 | if (leap <= i && leap > 0) { | ||
516 | offset += this.leapDays(y); isAdd = true; | ||
517 | } | ||
518 | } | ||
519 | offset += this.monthDays(y, i); | ||
520 | } | ||
521 | //转换闰月农历 需补充该年闰月的前一个月的时差 | ||
522 | if (isLeapMonth) { offset += day; } | ||
523 | //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) | ||
524 | var stmap = Date.UTC(1900, 1, 30, 0, 0, 0); | ||
525 | var calObj = new Date((offset + d - 31) * 86400000 + stmap); | ||
526 | var cY = calObj.getUTCFullYear(); | ||
527 | var cM = calObj.getUTCMonth() + 1; | ||
528 | var cD = calObj.getUTCDate(); | ||
529 | |||
530 | return this.solar2lunar(cY, cM, cD); | ||
531 | } | ||
532 | }; | ||
533 | |||
534 | // 农历转公历 | ||
535 | export function toSolar(year, month, day) { | ||
536 | // let result = Lunar.toSolar(year, month, day); | ||
537 | let result = calendar.lunar2solar(year, month, day); | ||
538 | return [result.cYear, result.cMonth, result.cDay]; | ||
539 | } | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or sign in to post a comment