1
Showing
6 changed files
with
747 additions
and
111 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; | ... | ... |
| 1 | 1 | ||
| 2 | <template> | 2 | <template> |
| 3 | <div> | 3 | <div> |
| 4 | <auth :model="'suggest'" @onLogin="userLogin" ref="auth"></auth> | 4 | <auth :model="'suggest'" @onLogin="userLogin" ref="auth"></auth> |
| 5 | <modal-comp :visible="modalVisiable" :show-confirm="false" :icon="modalIcon" :content="modalContent" :confirm="modalCallback" :overlay="modalCallback"></modal-comp> | 5 | <modal-comp :visible="modalVisiable" :show-confirm="false" :icon="modalIcon" :content="modalContent" :confirm="modalCallback" :overlay="modalCallback"></modal-comp> |
| 6 | <div class="reservation-container"> | 6 | <div class="reservation-container"> |
| 7 | <!-- 顶头iterm --> | 7 | <!-- 顶头iterm --> |
| 8 | <div class="form form2"> | 8 | <div class="form form2"> |
| 9 | <div class="form-item"> | 9 | <div class="form-item"> |
| 10 | <div class="label"> | 10 | <div class="label"> |
| 11 | <div class="icon"><img src="@/assets/images/reservation/icon-re-name.png"></div> {{$t('complaintAcceptance.name')}} | 11 | <div class="icon"><img src="@/assets/images/reservation/icon-re-name.png"></div> {{$t('complaintAcceptance.name')}} |
| 12 | </div> | 12 | </div> |
| 13 | <div class="ipt-wrap"> | 13 | <div class="ipt-wrap"> |
| 14 | <input class="ipt name-ipt" type="text" :class="{err : errorTips.nameErr.length > 0}" v-model="data.name"> | 14 | <input class="ipt name-ipt" type="text" :class="{err : errorTips.nameErr.length > 0}" v-model="data.name"> |
| 15 | </div> | 15 | </div> |
| 16 | <div class="validator" v-if="errorTips.nameErr.length > 0"> | 16 | <div class="validator" v-if="errorTips.nameErr.length > 0"> |
| 17 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.nameErr}} | 17 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.nameErr}} |
| 18 | </div> | 18 | </div> |
| 19 | </div> | 19 | </div> |
| 20 | 20 | ||
| 21 | <div class="form-item"> | 21 | <div class="form-item"> |
| 22 | <div class="label"> | 22 | <div class="label"> |
| 23 | <div class="icon"><img src="@/assets/images/reservation/icon-re-contact.png"></div>{{$t('complaintAcceptance.contactType')}} | 23 | <div class="icon"><img src="@/assets/images/reservation/icon-re-contact.png"></div>{{$t('complaintAcceptance.contactType')}} |
| 24 | </div> | 24 | </div> |
| 25 | <div class="ipt-wrap"> | 25 | <div class="ipt-wrap"> |
| 26 | <div class="down-arrow"></div> | 26 | <div class="down-arrow"></div> |
| 27 | <el-select class="ipt phone-ipt" v-model="data.contactType"> | 27 | <el-select class="ipt phone-ipt" v-model="data.contactType"> |
| 28 | <el-option v-for="(item,index) in contactTypes" :key="index" :value="item.value" :label="item.name"></el-option> | 28 | <el-option v-for="(item,index) in contactTypes" :key="index" :value="item.value" :label="item.name"></el-option> |
| 29 | </el-select> | 29 | </el-select> |
| 30 | </div> | 30 | </div> |
| 31 | <div class="validator" v-if="errorTips.contactTypeErr.length > 0"> | 31 | <div class="validator" v-if="errorTips.contactTypeErr.length > 0"> |
| 32 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.contactTypeErr}} | 32 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.contactTypeErr}} |
| 33 | </div> | 33 | </div> |
| 34 | </div> | 34 | </div> |
| 35 | 35 | ||
| 36 | <div class="form-item flex1"> | 36 | <div class="form-item flex1"> |
| 37 | <div class="label"> | 37 | <div class="label"> |
| 38 | <div class="icon"> | 38 | <div class="icon"> |
| 39 | <img v-if="contactIconShow == 'email'" src="@/assets/images/complaint-acceptance/icon-ca-mail.png"> | 39 | <img v-if="contactIconShow == 'email'" src="@/assets/images/complaint-acceptance/icon-ca-mail.png"> |
| 40 | <img v-else src="@/assets/images/contact-us/icon-cs-call.png"> | 40 | <img v-else src="@/assets/images/contact-us/icon-cs-call.png"> |
| 41 | </div>{{contactTypeShow}} | 41 | </div>{{contactTypeShow}} |
| 42 | </div> | 42 | </div> |
| 43 | <div class="ipt-wrap"> | 43 | <div class="ipt-wrap"> |
| 44 | <input class="ipt mail-ipt" type="text" :class="{err : errorTips.contactMethodErr.length > 0}" v-model="data.contactMethod" :placeholder="contactPlaceHolderShow"> | 44 | <input class="ipt mail-ipt" type="text" :class="{err : errorTips.contactMethodErr.length > 0}" v-model="data.contactMethod" :placeholder="contactPlaceHolderShow"> |
| 45 | </div> | 45 | </div> |
| 46 | <div class="validator" v-if="errorTips.contactMethodErr.length > 0"> | 46 | <div class="validator" v-if="errorTips.contactMethodErr.length > 0"> |
| 47 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.contactMethodErr}} | 47 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.contactMethodErr}} |
| 48 | </div> | 48 | </div> |
| 49 | </div> | 49 | </div> |
| 50 | 50 | ||
| 51 | </div> | 51 | </div> |
| 52 | 52 | ||
| 53 | <!-- 长文本 --> | 53 | <!-- 长文本 --> |
| 54 | <div class="form"> | 54 | <div class="form"> |
| 55 | <div class="pure-u-1 form-item"> | 55 | <div class="pure-u-1 form-item"> |
| 56 | <div class="label"> | 56 | <div class="label"> |
| 57 | <div class="icon"><img src="@/assets/images/reservation/icon-re-arrow-reservation.png"></div>{{$t('complaintAcceptance.question')}} | 57 | <div class="icon"><img src="@/assets/images/reservation/icon-re-arrow-reservation.png"></div>{{$t('complaintAcceptance.question')}} |
| 58 | </div> | 58 | </div> |
| 59 | <div class="ipt-wrap"> | 59 | <div class="ipt-wrap"> |
| 60 | <textarea :placeholder="$t('complaintAcceptance.questionPlaceHolder')" class="ipt textarea" :class="{err:errorTips.complainErr.length >0}" v-model="data.complain"></textarea> | 60 | <textarea :placeholder="$t('complaintAcceptance.questionPlaceHolder')" class="ipt textarea" :class="{err:errorTips.complainErr.length >0}" v-model="data.complain"></textarea> |
| 61 | </div> | 61 | </div> |
| 62 | <div class="validator" v-if="errorTips.complainErr.length > 0"> | 62 | <div class="validator" v-if="errorTips.complainErr.length > 0"> |
| 63 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.complainErr}} | 63 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.complainErr}} |
| 64 | </div> | 64 | </div> |
| 65 | </div> | 65 | </div> |
| 66 | 66 | ||
| 67 | <!-- 保单编号 非必填 --> | 67 | <!-- 保单编号 非必填 --> |
| 68 | <div class="pure-u-1 form-item form-item3"> | 68 | <div class="pure-u-1 form-item form-item3"> |
| 69 | <div class="label"> | 69 | <div class="label"> |
| 70 | <div class="icon"><img src="@/assets/images/complaint-acceptance/icon-ca-no.png"></div>{{$t('complaintAcceptance.orderNo')}} | 70 | <div class="icon"><img src="@/assets/images/complaint-acceptance/icon-ca-no.png"></div>{{$t('complaintAcceptance.orderNo')}} |
| 71 | </div> | 71 | </div> |
| 72 | <div class="ipt-wrap ipt-wrap2"> | 72 | <div class="ipt-wrap ipt-wrap2"> |
| 73 | <input :placeholder="$t('complaintAcceptance.orderNoPlaceHolder')" class="ipt" type="text" :class="{err:errorTips.policyNumberErr.length>0}" v-model="data.policyNumber"> | 73 | <input :placeholder="$t('complaintAcceptance.orderNoPlaceHolder')" class="ipt" type="text" :class="{err:errorTips.policyNumberErr.length>0}" v-model="data.policyNumber"> |
| 74 | </div> | 74 | </div> |
| 75 | <div class="validator" v-if="errorTips.policyNumberErr.length > 0"> | 75 | <div class="validator" v-if="errorTips.policyNumberErr.length > 0"> |
| 76 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.policyNumberErr}} | 76 | <img src="@/assets/images/common/icon-notice.png" alt="">{{errorTips.policyNumberErr}} |
| 77 | </div> | 77 | </div> |
| 78 | </div> | 78 | </div> |
| 79 | 79 | ||
| 80 | <!-- 联络时间 --> | 80 | <!-- 联络时间 --> |
| 81 | <div class="pure-u-1 form-item form-item3"> | 81 | <div class="pure-u-1 form-item form-item3"> |
| 82 | <div class="label"> | 82 | <div class="label"> |
| 83 | <div class="icon"><img src="@/assets/images/reservation/icon-re-calendar.png"></div>{{$t('complaintAcceptance.contactTime')}} | 83 | <div class="icon"><img src="@/assets/images/reservation/icon-re-calendar.png"></div>{{$t('complaintAcceptance.contactTime')}} |
| 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}} |
| 91 | </div> | 91 | </div> |
| 92 | <div class="mt8"> | 92 | <div class="mt8"> |
| 93 | <div class="label"> | 93 | <div class="label"> |
| 94 | </div> | 94 | </div> |
| 95 | <!-- <div class="calendar"> | 95 | <!-- <div class="calendar"> |
| 96 | <img src="@/assets/images/reservation/re-calendar.png"> | 96 | <img src="@/assets/images/reservation/re-calendar.png"> |
| 97 | </div> --> | 97 | </div> --> |
| 98 | </div> | 98 | </div> |
| 99 | </div> | 99 | </div> |
| 100 | </div> | 100 | </div> |
| 101 | 101 | ||
| 102 | <!-- 通知 --> | 102 | <!-- 通知 --> |
| 103 | <div class="notice"> | 103 | <div class="notice"> |
| 104 | <p class="notice-item"> | 104 | <p class="notice-item"> |
| 105 | <img class="notice-item-icon" src="@/assets/images/reservation/icon-re-notice.png"> {{$t('complaintAcceptance.notice1')}} | 105 | <img class="notice-item-icon" src="@/assets/images/reservation/icon-re-notice.png"> {{$t('complaintAcceptance.notice1')}} |
| 106 | </p> | 106 | </p> |
| 107 | <p class="notice-item pointer" @click="checked = !checked"> | 107 | <p class="notice-item pointer" @click="checked = !checked"> |
| 108 | <!-- <img v-if="!checked" class="notice-item-icon" src="@/assets/images/reservation/un-check.png"> | 108 | <!-- <img v-if="!checked" class="notice-item-icon" src="@/assets/images/reservation/un-check.png"> |
| 109 | <img v-else class="notice-item-icon" src="@/assets/images/reservation/check.png"> --> | 109 | <img v-else class="notice-item-icon" src="@/assets/images/reservation/check.png"> --> |
| 110 | |||
| 111 | <img v-if="!checked" class="notice-item-icon" src="@/assets/images/login/uncheck.png"> | ||
| 112 | <img v-else class="notice-item-icon" src="@/assets/images/login/check.png"> | ||
| 113 | 110 | ||
| 114 | {{$t('complaintAcceptance.notice2')}} | 111 | <img v-if="!checked" class="notice-item-icon" src="@/assets/images/login/uncheck.png"> |
| 115 | </p> | 112 | <img v-else class="notice-item-icon" src="@/assets/images/login/check.png"> |
| 116 | </div> | ||
| 117 | 113 | ||
| 118 | <!-- 提交按钮 --> | 114 | {{$t('complaintAcceptance.notice2')}} |
| 119 | <div class="submit-btn flex-center" @click="submitHandler" :class="{disabled:submitBtnDisabled}"> | 115 | </p> |
| 120 | <van-loading v-if="isSubmit" /> | 116 | </div> |
| 121 | <span>{{$t('reservation.submitBtn')}}</span> | 117 | |
| 122 | </div> | 118 | <!-- 提交按钮 --> |
| 123 | </div> | 119 | <div class="submit-btn flex-center" @click="submitHandler" :class="{disabled:submitBtnDisabled}"> |
| 124 | </div> | 120 | <van-loading v-if="isSubmit" /> |
| 121 | <span>{{$t('reservation.submitBtn')}}</span> | ||
| 122 | </div> | ||
| 123 | </div> | ||
| 124 | </div> | ||
| 125 | </template> | 125 | </template> |
| 126 | 126 | ||
| 127 | <script src="./complaint-acceptance.js"></script> | 127 | <script src="./complaint-acceptance.js"></script> | ... | ... |
| ... | @@ -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