first commit
This commit is contained in:
14
uni_modules/wu-calendar/components/i18n/en.json
Normal file
14
uni_modules/wu-calendar/components/i18n/en.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"wu-calender.ok": "ok",
|
||||
"wu-calender.cancel": "cancel",
|
||||
"wu-calender.year": "year",
|
||||
"wu-calender.month": "month",
|
||||
"wu-calender.today": "today",
|
||||
"wu-calender.MON": "MON",
|
||||
"wu-calender.TUE": "TUE",
|
||||
"wu-calender.WED": "WED",
|
||||
"wu-calender.THU": "THU",
|
||||
"wu-calender.FRI": "FRI",
|
||||
"wu-calender.SAT": "SAT",
|
||||
"wu-calender.SUN": "SUN"
|
||||
}
|
8
uni_modules/wu-calendar/components/i18n/index.js
Normal file
8
uni_modules/wu-calendar/components/i18n/index.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import en from './en.json'
|
||||
import zhHans from './zh-Hans.json'
|
||||
import zhHant from './zh-Hant.json'
|
||||
export default {
|
||||
en,
|
||||
'zh-Hans': zhHans,
|
||||
'zh-Hant': zhHant
|
||||
}
|
14
uni_modules/wu-calendar/components/i18n/zh-Hans.json
Normal file
14
uni_modules/wu-calendar/components/i18n/zh-Hans.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"wu-calender.ok": "确定",
|
||||
"wu-calender.cancel": "取消",
|
||||
"wu-calender.year": "年",
|
||||
"wu-calender.month": "月",
|
||||
"wu-calender.today": "今日",
|
||||
"wu-calender.SUN": "日",
|
||||
"wu-calender.MON": "一",
|
||||
"wu-calender.TUE": "二",
|
||||
"wu-calender.WED": "三",
|
||||
"wu-calender.THU": "四",
|
||||
"wu-calender.FRI": "五",
|
||||
"wu-calender.SAT": "六"
|
||||
}
|
14
uni_modules/wu-calendar/components/i18n/zh-Hant.json
Normal file
14
uni_modules/wu-calendar/components/i18n/zh-Hant.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"wu-calender.ok": "確定",
|
||||
"wu-calender.cancel": "取消",
|
||||
"wu-calender.year": "年",
|
||||
"wu-calender.month": "月",
|
||||
"wu-calender.today": "今日",
|
||||
"wu-calender.SUN": "日",
|
||||
"wu-calender.MON": "一",
|
||||
"wu-calender.TUE": "二",
|
||||
"wu-calender.WED": "三",
|
||||
"wu-calender.THU": "四",
|
||||
"wu-calender.FRI": "五",
|
||||
"wu-calender.SAT": "六"
|
||||
}
|
@@ -0,0 +1,63 @@
|
||||
export default {
|
||||
props: {
|
||||
showMonth: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 折叠状态
|
||||
FoldStatus: {
|
||||
type: String,
|
||||
default: null
|
||||
},
|
||||
month: {
|
||||
type: [Number, String],
|
||||
default: null
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
default: '#3c9cff'
|
||||
},
|
||||
startText: {
|
||||
type: String,
|
||||
default: '开始'
|
||||
},
|
||||
endText: {
|
||||
type: String,
|
||||
default: '结束'
|
||||
},
|
||||
weeks: {
|
||||
type: [Object, Array],
|
||||
default: ()=> {
|
||||
return []
|
||||
}
|
||||
},
|
||||
calendar: {
|
||||
type: Object,
|
||||
default: () => {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
selected: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return []
|
||||
}
|
||||
},
|
||||
lunar: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
itemHeight: {
|
||||
type: Number,
|
||||
default: 64
|
||||
},
|
||||
monthShowCurrentMonth: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
actBadgeColor: {
|
||||
type: String,
|
||||
default: '#fff'
|
||||
},
|
||||
}
|
||||
}
|
@@ -0,0 +1,111 @@
|
||||
<template>
|
||||
<view class="wu-calendar-block">
|
||||
<view v-if="showMonth && FoldShowMonth" class="wu-calendar__box-bg">
|
||||
<text class="wu-calendar__box-bg-text">{{month}}</text>
|
||||
</view>
|
||||
<!-- 月或周日历 -->
|
||||
<view class="wu-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
|
||||
<view class="wu-calendar__weeks-item" v-for="(weeks, weeksIndex) in item" :key="weeksIndex" :style="[weekItemStyle]">
|
||||
<wu-calendar-item v-if="!monthShowCurrentMonth || !weeks.empty" class="wu-calendar-item--hook" :weeks="weeks" :calendar="calendar"
|
||||
:selected="selected" :lunar="lunar" @change="choiceDate" :color="color" :actBadgeColor="actBadgeColor"
|
||||
:startText="startText" :endText="endText" :itemHeight="itemHeight - defaultMargin"></wu-calendar-item>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mpMixin from '@/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js';
|
||||
import mixin from '@/uni_modules/wu-ui-tools/libs/mixin/mixin.js';
|
||||
import props from './props.js';
|
||||
|
||||
import {
|
||||
initVueI18n
|
||||
} from '@dcloudio/uni-i18n'
|
||||
import i18nMessages from '../i18n/index.js'
|
||||
const {
|
||||
t
|
||||
} = initVueI18n(i18nMessages)
|
||||
|
||||
export default {
|
||||
emits: ['change'],
|
||||
mixins: [mpMixin, mixin, props],
|
||||
data() {
|
||||
return {
|
||||
FoldShowMonth: false,
|
||||
// 默认边距
|
||||
defaultMargin: 8
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.FoldShowMonth = this.FoldStatus == 'open';
|
||||
},
|
||||
computed: {
|
||||
weekItemStyle() {
|
||||
let weeksLength = Object.keys(this.weeks).length;
|
||||
let calendarHeight = this.FoldStatus === 'open' ? this.itemHeight * 6 : this.itemHeight;
|
||||
let margin = weeksLength && this.weeks[weeksLength - 1][0].empty ? this.itemHeight / (weeksLength - 1) + this.defaultMargin : this.defaultMargin
|
||||
return {
|
||||
marginTop: margin / 2 + 'px',
|
||||
marginBottom: margin / 2 + 'px',
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
FoldStatus(newVal) {
|
||||
this.$nextTick(()=>{
|
||||
this.FoldShowMonth = this.FoldStatus == 'open';
|
||||
})
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
choiceDate(weeks) {
|
||||
this.$emit('change', weeks)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$wu-text-color-grey: #999;
|
||||
|
||||
.wu-calendar-block {
|
||||
.wu-calendar__weeks {
|
||||
position: relative;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
padding: 0 8rpx;
|
||||
}
|
||||
|
||||
.wu-calendar__weeks-item {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.wu-calendar__box-bg {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.wu-calendar__box-bg-text {
|
||||
font-size: 100rpx;
|
||||
transform: scale(4);
|
||||
font-weight: bold;
|
||||
color: $wu-text-color-grey;
|
||||
opacity: 0.1;
|
||||
text-align: center;
|
||||
/* #ifndef APP-NVUE */
|
||||
line-height: 1;
|
||||
/* #endif */
|
||||
}
|
||||
}
|
||||
</style>
|
46
uni_modules/wu-calendar/components/wu-calendar-item/props.js
Normal file
46
uni_modules/wu-calendar/components/wu-calendar-item/props.js
Normal file
@@ -0,0 +1,46 @@
|
||||
export default {
|
||||
props: {
|
||||
color: {
|
||||
type: String,
|
||||
default: '#3c9cff'
|
||||
},
|
||||
startText: {
|
||||
type: String,
|
||||
default: '开始'
|
||||
},
|
||||
endText: {
|
||||
type: String,
|
||||
default: '结束'
|
||||
},
|
||||
weeks: {
|
||||
type: Object,
|
||||
default () {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
calendar: {
|
||||
type: Object,
|
||||
default: () => {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
selected: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return []
|
||||
}
|
||||
},
|
||||
lunar: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
itemHeight: {
|
||||
type: Number,
|
||||
default: 64
|
||||
},
|
||||
actBadgeColor: {
|
||||
type: String,
|
||||
default: '#fff',
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,232 @@
|
||||
<template>
|
||||
<view class="wu-calendar-item__weeks-box" ref="$weeksbox" :style="[calendarItemStyle, {
|
||||
borderTopLeftRadius: weeks.beforeRange ? '12rpx' : '',
|
||||
borderBottomLeftRadius: weeks.beforeRange ? '12rpx' : '',
|
||||
borderTopRightRadius: weeks.afterRange ? '12rpx' : '',
|
||||
borderBottomRightRadius: weeks.afterRange ? '12rpx' : '',
|
||||
}]" @click="choiceDate(weeks)">
|
||||
<view class="wu-calendar-item__weeks-box-item" :style="[actMultipleStyle, {height: itemHeight + 'px'}]">
|
||||
<!-- 自定义打点上方信息 -->
|
||||
<text v-if="weeks.extraInfo && weeks.extraInfo.topInfo" class="wu-calendar-item__weeks-lunar-text" :style="[{color: weeks.extraInfo.topInfoColor || '#e43d33'}, calendarItemStyle, actMultipleStyle]">{{weeks.extraInfo.topInfo}}</text>
|
||||
<!-- 徽标 -->
|
||||
<text v-if="selected && weeks.extraInfo && weeks.extraInfo.badge" class="wu-calendar-item__weeks-box-circle" :style="[badgeStyle]"></text>
|
||||
<!-- 选中的文字展示 -->
|
||||
<text v-if="!(weeks.extraInfo && weeks.extraInfo.topInfo) && (weeks.beforeRange || weeks.afterRange)" class="wu-calendar-item__weeks-lunar-text" :style="[calendarItemStyle, actMultipleStyle]">{{multipleText}}</text>
|
||||
<!-- 今日的文字 -->
|
||||
<text v-if="!lunar && !(weeks.extraInfo && weeks.extraInfo.topInfo) && weeks.isDay && !weeks.beforeRange && !weeks.afterRange" class="wu-calendar-item__weeks-lunar-text" :style="[calendarItemStyle, actMultipleStyle]">{{todayText}}</text>
|
||||
<!-- 农历文字 -->
|
||||
<text v-if="lunar && !(weeks.extraInfo && weeks.extraInfo.topInfo) && !weeks.beforeRange && !weeks.afterRange" class="wu-calendar-item__weeks-lunar-text" :style="[calendarItemStyle, actMultipleStyle]">{{dayText}}</text>
|
||||
<!-- 日期文字 -->
|
||||
<text class="wu-calendar-item__weeks-box-text" :style="[calendarItemStyle, actMultipleStyle]">{{weeks.date}}</text>
|
||||
<!-- 今日的文字 -->
|
||||
<!-- <text v-if="!lunar && !weeks.extraInfo && weeks.isDay && !weeks.beforeRange && !weeks.afterRange" class="wu-calendar-item__weeks-lunar-text" :style="[calendarItemStyle, actMultipleStyle]">{{todayText}}</text> -->
|
||||
<!-- 农历文字 -->
|
||||
<!-- <text v-if="lunar && !weeks.extraInfo && !weeks.beforeRange && !weeks.afterRange" class="wu-calendar-item__weeks-lunar-text" :style="[calendarItemStyle, actMultipleStyle]">{{dayText}}</text> -->
|
||||
<!-- 选中的文字展示 -->
|
||||
<!-- <text v-if="!weeks.extraInfo && (weeks.beforeRange || weeks.afterRange)" class="wu-calendar-item__weeks-lunar-text" :style="[calendarItemStyle, actMultipleStyle]">{{multipleText}}</text> -->
|
||||
<!-- 自定义打点下方信息 -->
|
||||
<text v-if="weeks.extraInfo && weeks.extraInfo.info" class="wu-calendar-item__weeks-lunar-text" :style="[{color: weeks.extraInfo.infoColor || '#e43d33'}, actMultipleStyle]">{{weeks.extraInfo.info}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import mpMixin from '@/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js';
|
||||
import mixin from '@/uni_modules/wu-ui-tools/libs/mixin/mixin.js';
|
||||
import props from './props.js';
|
||||
|
||||
import {
|
||||
initVueI18n
|
||||
} from '@dcloudio/uni-i18n'
|
||||
import i18nMessages from '../i18n/index.js'
|
||||
const {
|
||||
t
|
||||
} = initVueI18n(i18nMessages)
|
||||
|
||||
export default {
|
||||
emits: ['change'],
|
||||
mixins: [mpMixin, mixin, props],
|
||||
computed: {
|
||||
todayText() {
|
||||
return t("wu-calender.today")
|
||||
},
|
||||
// 每项日历样式
|
||||
calendarItemStyle() {
|
||||
let style = {};
|
||||
let color = this.$w.Color.gradient(this.color, this.$w.Color.isLight(this.color) ? '#000' : '#fff', 100)[6]
|
||||
// 有顺序别乱动
|
||||
// 选中的日期范围内的样式
|
||||
if (this.weeks.rangeMultiple) {
|
||||
style = {
|
||||
backgroundColor: this.$w.Color.gradient(this.color, '#fff', 100)[80],
|
||||
color
|
||||
}
|
||||
};
|
||||
// 今天的日期样式
|
||||
if (this.weeks.isDay) {
|
||||
style.color = color;
|
||||
}
|
||||
// 禁用的日期样式
|
||||
if(this.weeks.disable) {
|
||||
style = {
|
||||
backgroundColor: 'rgba(249, 249, 249, 0.3)',
|
||||
color: '#c0c0c0'
|
||||
}
|
||||
}
|
||||
return style;
|
||||
},
|
||||
// 选中的日期样式
|
||||
actMultipleStyle() {
|
||||
if ((this.weeks.beforeRange || this.weeks.afterRange || this.weeks.multiples || (this.calendar.fullDate === this.weeks
|
||||
.fullDate && this.weeks.mode === 'single')) && !this.weeks.disable) {
|
||||
return {
|
||||
backgroundColor: this.color,
|
||||
color: '#fff',
|
||||
borderRadius: '12rpx'
|
||||
}
|
||||
}
|
||||
},
|
||||
// 徽标样式
|
||||
badgeStyle() {
|
||||
let style = {
|
||||
backgroundColor: this.weeks.disable ? '#c0c0c0' : '#e43d33',
|
||||
width: '16rpx',
|
||||
height: '16rpx'
|
||||
};
|
||||
if(this.weeks.extraInfo) {
|
||||
if(this.weeks.extraInfo.badgeColor) {
|
||||
// 如果当前是选中日期的徽标且徽标颜色与主题色一致 为了保证 徽标颜色可以被看见 再选中时将其设置为 #fff
|
||||
if ((this.weeks.beforeRange || this.weeks.afterRange || this.weeks.multiples || (this.calendar.fullDate === this.weeks
|
||||
.fullDate && this.weeks.mode === 'single')) && !this.weeks.disable && this.$w.Color.convertFormat(this.weeks.extraInfo.badgeColor) == this.$w.Color.convertFormat(this.color)) {
|
||||
style.backgroundColor = this.actBadgeColor;
|
||||
} else {
|
||||
style.backgroundColor = this.weeks.extraInfo.badgeColor
|
||||
}
|
||||
}
|
||||
if(this.weeks.extraInfo.badgeSize) {
|
||||
style.width = this.weeks.extraInfo.badgeSize
|
||||
style.height = this.weeks.extraInfo.badgeSize
|
||||
}
|
||||
|
||||
if(!this.weeks.extraInfo.badgePosition) {
|
||||
style.right = '10rpx';
|
||||
style.top = '10rpx';
|
||||
} else if(this.weeks.extraInfo.badgePosition == 'top-left'){
|
||||
style.top = '10rpx';
|
||||
style.left = '10rpx';
|
||||
} else if(this.weeks.extraInfo.badgePosition == 'top-center'){
|
||||
style.top = '10rpx';
|
||||
style.left = 'center';
|
||||
} else if(this.weeks.extraInfo.badgePosition == 'top-right'){
|
||||
style.top = '10rpx';
|
||||
style.right = '10rpx';
|
||||
} else if(this.weeks.extraInfo.badgePosition == 'bottom-left'){
|
||||
style.bottom = '10rpx';
|
||||
style.left = '10rpx';
|
||||
} else if(this.weeks.extraInfo.badgePosition == 'bottom-center'){
|
||||
style.bottom = '10rpx';
|
||||
style.left = 'center';
|
||||
} else if(this.weeks.extraInfo.badgePosition == 'bottom-right'){
|
||||
style.bottom = '10rpx';
|
||||
style.right = '10rpx';
|
||||
}
|
||||
}
|
||||
|
||||
return style
|
||||
},
|
||||
// 日期文字
|
||||
dayText() {
|
||||
let text = '';
|
||||
if (this.weeks.isDay) {
|
||||
text = this.todayText
|
||||
} else if(this.weeks.lunar.festival) {
|
||||
text = this.weeks.lunar.festival
|
||||
} else if(this.weeks.lunar.isTerm) {
|
||||
text = this.weeks.lunar.Term
|
||||
} else if (this.weeks.lunar.IDayCn === '初一') {
|
||||
text = this.weeks.lunar.IMonthCn
|
||||
} else {
|
||||
text = this.weeks.lunar.IDayCn
|
||||
}
|
||||
return text
|
||||
},
|
||||
// 选中的文字
|
||||
multipleText() {
|
||||
let text = '';
|
||||
if (this.weeks.afterRange) {
|
||||
text = this.endText
|
||||
} else if (this.weeks.beforeRange) {
|
||||
text = this.startText
|
||||
}
|
||||
return text;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
choiceDate(weeks) {
|
||||
this.$emit('change', weeks)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '@/uni_modules/wu-ui-tools/theme.scss';
|
||||
$wu-font-size-base: 28rpx;
|
||||
$wu-text-color: #333;
|
||||
$wu-font-size-sm: 24rpx;
|
||||
$wu-color-error: #e43d33;
|
||||
$wu-opacity-disabled: 0.3;
|
||||
$wu-text-color-disable: #c0c0c0;
|
||||
|
||||
.wu-calendar-item__weeks-box {
|
||||
flex: 1;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 0 0.5px;
|
||||
}
|
||||
|
||||
.wu-calendar-item__weeks-box-text {
|
||||
font-size: $wu-font-size-base;
|
||||
color: $wu-text-color;
|
||||
}
|
||||
|
||||
.wu-calendar-item__weeks-lunar-text {
|
||||
font-size: $wu-font-size-sm;
|
||||
color: $wu-text-color;
|
||||
}
|
||||
|
||||
.wu-calendar-item__weeks-box-item {
|
||||
position: relative;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.wu-calendar-item__weeks-box-circle {
|
||||
position: absolute;
|
||||
border-radius: 16rpx;
|
||||
background-color: $wu-color-error;
|
||||
}
|
||||
|
||||
.wu-calendar-item--disable {
|
||||
background-color: rgba(249, 249, 249, $wu-opacity-disabled);
|
||||
color: $wu-text-color-disable;
|
||||
}
|
||||
|
||||
.wu-calendar-item--extra {
|
||||
color: $wu-color-error;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.wu-calendar-item--checked {
|
||||
color: #fff;
|
||||
}
|
||||
</style>
|
664
uni_modules/wu-calendar/components/wu-calendar/calendar.js
Normal file
664
uni_modules/wu-calendar/components/wu-calendar/calendar.js
Normal file
@@ -0,0 +1,664 @@
|
||||
/**
|
||||
* @1900-2100区间内的公历、农历互转
|
||||
* @charset UTF-8
|
||||
* @github https://github.com/jjonline/calendar.js
|
||||
* @Author Jea杨(JJonline@JJonline.Cn)
|
||||
* @Time 2014-7-21
|
||||
* @Time 2016-8-13 Fixed 2033hex、Attribution Annals
|
||||
* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
|
||||
* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
|
||||
* @Version 1.0.3
|
||||
* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
|
||||
* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
|
||||
*/
|
||||
/* eslint-disable */
|
||||
var calendar = {
|
||||
|
||||
/**
|
||||
* 农历1900-2100的润大小信息表
|
||||
* @Array Of Property
|
||||
* @return Hex
|
||||
*/
|
||||
lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0,
|
||||
0x055d2, // 1900-1909
|
||||
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
|
||||
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
|
||||
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
|
||||
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
|
||||
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
|
||||
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
|
||||
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
|
||||
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
|
||||
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
|
||||
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
|
||||
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
|
||||
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
|
||||
0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
|
||||
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
|
||||
/** Add By JJonline@JJonline.Cn**/
|
||||
0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
|
||||
0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
|
||||
0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
|
||||
0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
|
||||
0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
|
||||
0x0d520
|
||||
], // 2100
|
||||
|
||||
/**
|
||||
* 公历每个月份的天数普通表
|
||||
* @Array Of Property
|
||||
* @return Number
|
||||
*/
|
||||
solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
|
||||
|
||||
/**
|
||||
* 天干地支之天干速查表
|
||||
* @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
|
||||
* @return Cn string
|
||||
*/
|
||||
Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
|
||||
|
||||
/**
|
||||
* 天干地支之地支速查表
|
||||
* @Array Of Property
|
||||
* @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
|
||||
* @return Cn string
|
||||
*/
|
||||
Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149',
|
||||
'\u620c', '\u4ea5'
|
||||
],
|
||||
|
||||
/**
|
||||
* 天干地支之地支速查表<=>生肖
|
||||
* @Array Of Property
|
||||
* @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
|
||||
* @return Cn string
|
||||
*/
|
||||
Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21',
|
||||
'\u72d7', '\u732a'
|
||||
],
|
||||
|
||||
/**
|
||||
* 24节气速查表
|
||||
* @Array Of Property
|
||||
* @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
|
||||
* @return Cn string
|
||||
*/
|
||||
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'
|
||||
],
|
||||
|
||||
/**
|
||||
* 1900-2100各年的24节气日期速查表
|
||||
* @Array Of Property
|
||||
* @return 0x string For splice
|
||||
*/
|
||||
sTermInfo: [
|
||||
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
|
||||
'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
|
||||
'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
|
||||
'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
|
||||
'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
|
||||
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
|
||||
'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
|
||||
'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
|
||||
'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
|
||||
'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
|
||||
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
|
||||
'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
|
||||
'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
|
||||
'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
|
||||
'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
|
||||
'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
|
||||
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
|
||||
'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
|
||||
'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
|
||||
'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
|
||||
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
|
||||
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
|
||||
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
|
||||
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
|
||||
'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
|
||||
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
|
||||
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
|
||||
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
|
||||
'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
|
||||
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'
|
||||
],
|
||||
|
||||
festivals: {
|
||||
'1-1': '元旦',
|
||||
'2-14': '情人节',
|
||||
'3-8': '妇女节',
|
||||
'3-12': '植树节',
|
||||
'4-1': '愚人节',
|
||||
'5-1': '劳动节',
|
||||
'5-4': '青年节',
|
||||
'5-12': '护士节',
|
||||
'6-1': '儿童节',
|
||||
'8-1': '建军节',
|
||||
'9-10': '教师节',
|
||||
'10-1': '国庆',
|
||||
'11-1': '万圣节',
|
||||
'12-24': '圣诞节',
|
||||
'正月初一': '春节',
|
||||
'二月初二': '龙抬头',
|
||||
'五月初五': '端午节',
|
||||
'七月初七': '七夕节',
|
||||
'七月十五': '中元节',
|
||||
'八月十五': '中秋节',
|
||||
'九月初九': '重阳节',
|
||||
'腊月初八': '腊八节',
|
||||
'腊月廿三': '小年',
|
||||
'腊月三十': '除夕',
|
||||
},
|
||||
|
||||
/**
|
||||
* 数字转中文速查表
|
||||
* @Array Of Property
|
||||
* @trans ['日','一','二','三','四','五','六','七','八','九','十']
|
||||
* @return Cn string
|
||||
*/
|
||||
nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d',
|
||||
'\u5341'
|
||||
],
|
||||
|
||||
/**
|
||||
* 日期转农历称呼速查表
|
||||
* @Array Of Property
|
||||
* @trans ['初','十','廿','卅']
|
||||
* @return Cn string
|
||||
*/
|
||||
nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
|
||||
|
||||
/**
|
||||
* 月份转农历称呼速查表
|
||||
* @Array Of Property
|
||||
* @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
|
||||
* @return Cn string
|
||||
*/
|
||||
nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341',
|
||||
'\u51ac', '\u814a'
|
||||
],
|
||||
|
||||
/**
|
||||
* 返回农历y年一整年的总天数
|
||||
* @param lunar Year
|
||||
* @return Number
|
||||
* @eg:var count = calendar.lYearDays(1987) ;//count=387
|
||||
*/
|
||||
lYearDays: function(y) {
|
||||
var i;
|
||||
var sum = 348
|
||||
for (i = 0x8000; i > 0x8; i >>= 1) {
|
||||
sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0
|
||||
}
|
||||
return (sum + this.leapDays(y))
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
|
||||
* @param lunar Year
|
||||
* @return Number (0-12)
|
||||
* @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
|
||||
*/
|
||||
leapMonth: function(y) { // 闰字编码 \u95f0
|
||||
return (this.lunarInfo[y - 1900] & 0xf)
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回农历y年闰月的天数 若该年没有闰月则返回0
|
||||
* @param lunar Year
|
||||
* @return Number (0、29、30)
|
||||
* @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
|
||||
*/
|
||||
leapDays: function(y) {
|
||||
if (this.leapMonth(y)) {
|
||||
return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
|
||||
}
|
||||
return (0)
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
|
||||
* @param lunar Year
|
||||
* @return Number (-1、29、30)
|
||||
* @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
|
||||
*/
|
||||
monthDays: function(y, m) {
|
||||
if (m > 12 || m < 1) {
|
||||
return -1
|
||||
} // 月份参数从1至12,参数错误返回-1
|
||||
return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回公历(!)y年m月的天数
|
||||
* @param solar Year
|
||||
* @return Number (-1、28、29、30、31)
|
||||
* @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
|
||||
*/
|
||||
solarDays: function(y, m) {
|
||||
if (m > 12 || m < 1) {
|
||||
return -1
|
||||
} // 若参数错误 返回-1
|
||||
var ms = m - 1
|
||||
if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
|
||||
return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
|
||||
} else {
|
||||
return (this.solarMonth[ms])
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 农历年份转换为干支纪年
|
||||
* @param lYear 农历年的年份数
|
||||
* @return Cn string
|
||||
*/
|
||||
toGanZhiYear: function(lYear) {
|
||||
var ganKey = (lYear - 3) % 10
|
||||
var zhiKey = (lYear - 3) % 12
|
||||
if (ganKey == 0) ganKey = 10 // 如果余数为0则为最后一个天干
|
||||
if (zhiKey == 0) zhiKey = 12 // 如果余数为0则为最后一个地支
|
||||
return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
|
||||
},
|
||||
|
||||
/**
|
||||
* 公历月、日判断所属星座
|
||||
* @param cMonth [description]
|
||||
* @param cDay [description]
|
||||
* @return Cn string
|
||||
*/
|
||||
toAstro: function(cMonth, cDay) {
|
||||
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'
|
||||
var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
|
||||
return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7' // 座
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入offset偏移量返回干支
|
||||
* @param offset 相对甲子的偏移量
|
||||
* @return Cn string
|
||||
*/
|
||||
toGanZhi: function(offset) {
|
||||
return this.Gan[offset % 10] + this.Zhi[offset % 12]
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入公历(!)y年获得该年第n个节气的公历日期
|
||||
* @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
|
||||
* @return day Number
|
||||
* @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
|
||||
*/
|
||||
getTerm: function(y, n) {
|
||||
if (y < 1900 || y > 2100) {
|
||||
return -1
|
||||
}
|
||||
if (n < 1 || n > 24) {
|
||||
return -1
|
||||
}
|
||||
var _table = this.sTermInfo[y - 1900]
|
||||
var _info = [
|
||||
parseInt('0x' + _table.substr(0, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(5, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(10, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(15, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(20, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(25, 5)).toString()
|
||||
]
|
||||
var _calday = [
|
||||
_info[0].substr(0, 1),
|
||||
_info[0].substr(1, 2),
|
||||
_info[0].substr(3, 1),
|
||||
_info[0].substr(4, 2),
|
||||
|
||||
_info[1].substr(0, 1),
|
||||
_info[1].substr(1, 2),
|
||||
_info[1].substr(3, 1),
|
||||
_info[1].substr(4, 2),
|
||||
|
||||
_info[2].substr(0, 1),
|
||||
_info[2].substr(1, 2),
|
||||
_info[2].substr(3, 1),
|
||||
_info[2].substr(4, 2),
|
||||
|
||||
_info[3].substr(0, 1),
|
||||
_info[3].substr(1, 2),
|
||||
_info[3].substr(3, 1),
|
||||
_info[3].substr(4, 2),
|
||||
|
||||
_info[4].substr(0, 1),
|
||||
_info[4].substr(1, 2),
|
||||
_info[4].substr(3, 1),
|
||||
_info[4].substr(4, 2),
|
||||
|
||||
_info[5].substr(0, 1),
|
||||
_info[5].substr(1, 2),
|
||||
_info[5].substr(3, 1),
|
||||
_info[5].substr(4, 2)
|
||||
]
|
||||
return parseInt(_calday[n - 1])
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入农历数字月份返回汉语通俗表示法
|
||||
* @param lunar month
|
||||
* @return Cn string
|
||||
* @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
|
||||
*/
|
||||
toChinaMonth: function(m) { // 月 => \u6708
|
||||
if (m > 12 || m < 1) {
|
||||
return -1
|
||||
} // 若参数错误 返回-1
|
||||
var s = this.nStr3[m - 1]
|
||||
s += '\u6708' // 加上月字
|
||||
return s
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入农历日期数字返回汉字表示法
|
||||
* @param lunar day
|
||||
* @return Cn string
|
||||
* @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
|
||||
*/
|
||||
toChinaDay: function(d) { // 日 => \u65e5
|
||||
var s
|
||||
switch (d) {
|
||||
case 10:
|
||||
s = '\u521d\u5341';
|
||||
break
|
||||
case 20:
|
||||
s = '\u4e8c\u5341';
|
||||
break
|
||||
break
|
||||
case 30:
|
||||
s = '\u4e09\u5341';
|
||||
break
|
||||
break
|
||||
default:
|
||||
s = this.nStr2[Math.floor(d / 10)]
|
||||
s += this.nStr1[d % 10]
|
||||
}
|
||||
return (s)
|
||||
},
|
||||
|
||||
/**
|
||||
* 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
|
||||
* @param y year
|
||||
* @return Cn string
|
||||
* @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
|
||||
*/
|
||||
getAnimal: function(y) {
|
||||
return this.Animals[(y - 4) % 12]
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
|
||||
* @param y solar year
|
||||
* @param m solar month
|
||||
* @param d solar day
|
||||
* @return JSON object
|
||||
* @eg:console.log(calendar.solar2lunar(1987,11,01));
|
||||
*/
|
||||
solar2lunar: function(y, m, d) { // 参数区间1900.1.31~2100.12.31
|
||||
// 年份限定、上限
|
||||
if (y < 1900 || y > 2100) {
|
||||
return -1 // undefined转换为数字变为NaN
|
||||
}
|
||||
// 公历传参最下限
|
||||
if (y == 1900 && m == 1 && d < 31) {
|
||||
return -1
|
||||
}
|
||||
// 未传参 获得当天
|
||||
if (!y) {
|
||||
var objDate = new Date()
|
||||
} else {
|
||||
var objDate = new Date(y, parseInt(m) - 1, d)
|
||||
}
|
||||
var i;
|
||||
var leap = 0;
|
||||
var temp = 0
|
||||
// 修正ymd参数
|
||||
var y = objDate.getFullYear()
|
||||
var m = objDate.getMonth() + 1
|
||||
var d = objDate.getDate()
|
||||
var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0,
|
||||
31)) / 86400000
|
||||
for (i = 1900; i < 2101 && offset > 0; i++) {
|
||||
temp = this.lYearDays(i)
|
||||
offset -= temp
|
||||
}
|
||||
if (offset < 0) {
|
||||
offset += temp;
|
||||
i--
|
||||
}
|
||||
|
||||
// 是否今天
|
||||
var isTodayObj = new Date()
|
||||
var isToday = false
|
||||
if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
|
||||
isToday = true
|
||||
}
|
||||
// 星期几
|
||||
var nWeek = objDate.getDay()
|
||||
var cWeek = this.nStr1[nWeek]
|
||||
// 数字表示周几顺应天朝周一开始的惯例
|
||||
if (nWeek == 0) {
|
||||
nWeek = 7
|
||||
}
|
||||
// 农历年
|
||||
var year = i
|
||||
var leap = this.leapMonth(i) // 闰哪个月
|
||||
var isLeap = false
|
||||
|
||||
// 效验闰月
|
||||
for (i = 1; i < 13 && offset > 0; i++) {
|
||||
// 闰月
|
||||
if (leap > 0 && i == (leap + 1) && isLeap == false) {
|
||||
--i
|
||||
isLeap = true;
|
||||
temp = this.leapDays(year) // 计算农历闰月天数
|
||||
} else {
|
||||
temp = this.monthDays(year, i) // 计算农历普通月天数
|
||||
}
|
||||
// 解除闰月
|
||||
if (isLeap == true && i == (leap + 1)) {
|
||||
isLeap = false
|
||||
}
|
||||
offset -= temp
|
||||
}
|
||||
// 闰月导致数组下标重叠取反
|
||||
if (offset == 0 && leap > 0 && i == leap + 1) {
|
||||
if (isLeap) {
|
||||
isLeap = false
|
||||
} else {
|
||||
isLeap = true;
|
||||
--i
|
||||
}
|
||||
}
|
||||
if (offset < 0) {
|
||||
offset += temp;
|
||||
--i
|
||||
}
|
||||
// 农历月
|
||||
var month = i
|
||||
// 农历日
|
||||
var day = offset + 1
|
||||
// 天干地支处理
|
||||
var sm = m - 1
|
||||
var gzY = this.toGanZhiYear(year)
|
||||
|
||||
// 当月的两个节气
|
||||
// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
|
||||
var firstNode = this.getTerm(y, (m * 2 - 1)) // 返回当月「节」为几日开始
|
||||
var secondNode = this.getTerm(y, (m * 2)) // 返回当月「节」为几日开始
|
||||
|
||||
// 依据12节气修正干支月
|
||||
var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
|
||||
if (d >= firstNode) {
|
||||
gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
|
||||
}
|
||||
|
||||
// 传入的日期的节气与否
|
||||
var isTerm = false
|
||||
var Term = null
|
||||
if (firstNode == d) {
|
||||
isTerm = true
|
||||
Term = this.solarTerm[m * 2 - 2]
|
||||
}
|
||||
if (secondNode == d) {
|
||||
isTerm = true
|
||||
Term = this.solarTerm[m * 2 - 1]
|
||||
}
|
||||
|
||||
// 计算农历日期
|
||||
const IMonthCn = (isLeap ? '\u95f0' : '') + this.toChinaMonth(month)
|
||||
// 农历日期的汉字表述法
|
||||
let IDayCn = this.toChinaDay(day)
|
||||
|
||||
// 节日
|
||||
let festival = '';
|
||||
// 农历的月日汉字表述
|
||||
let lMDcn = IMonthCn + IDayCn;
|
||||
// 月份日期
|
||||
let MD = m + '-' + d;
|
||||
if (this.festivals.hasOwnProperty(lMDcn)) {
|
||||
festival = this.festivals[lMDcn]
|
||||
} else if(this.festivals.hasOwnProperty(MD)) {
|
||||
festival = this.festivals[MD]
|
||||
}
|
||||
|
||||
// 日柱 当月一日与 1900/1/1 相差天数
|
||||
var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
|
||||
var gzD = this.toGanZhi(dayCyclical + d - 1)
|
||||
// 该日期所属的星座
|
||||
var astro = this.toAstro(m, d)
|
||||
|
||||
return {
|
||||
'lYear': year,
|
||||
'lMonth': month,
|
||||
'lDay': day,
|
||||
'Animal': this.getAnimal(year),
|
||||
'IMonthCn': IMonthCn,
|
||||
'IDayCn': IDayCn,
|
||||
'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,
|
||||
'festival': festival
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
|
||||
* @param y lunar year
|
||||
* @param m lunar month
|
||||
* @param d lunar day
|
||||
* @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
|
||||
* @return JSON object
|
||||
* @eg:console.log(calendar.lunar2solar(1987,9,10));
|
||||
*/
|
||||
lunar2solar: function(y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
|
||||
var isLeapMonth = !!isLeapMonth
|
||||
var leapOffset = 0
|
||||
var leapMonth = this.leapMonth(y)
|
||||
var leapDay = this.leapDays(y)
|
||||
if (isLeapMonth && (leapMonth != m)) {
|
||||
return -1
|
||||
} // 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
|
||||
if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) {
|
||||
return -1
|
||||
} // 超出了最大极限值
|
||||
var day = this.monthDays(y, m)
|
||||
var _day = day
|
||||
// bugFix 2016-9-25
|
||||
// if month is leap, _day use leapDays method
|
||||
if (isLeapMonth) {
|
||||
_day = this.leapDays(y, m)
|
||||
}
|
||||
if (y < 1900 || y > 2100 || d > _day) {
|
||||
return -1
|
||||
} // 参数合法性效验
|
||||
|
||||
// 计算农历的时间差
|
||||
var offset = 0
|
||||
for (var i = 1900; i < y; i++) {
|
||||
offset += this.lYearDays(i)
|
||||
}
|
||||
var leap = 0;
|
||||
var isAdd = false
|
||||
for (var i = 1; i < m; i++) {
|
||||
leap = this.leapMonth(y)
|
||||
if (!isAdd) { // 处理闰月
|
||||
if (leap <= i && leap > 0) {
|
||||
offset += this.leapDays(y);
|
||||
isAdd = true
|
||||
}
|
||||
}
|
||||
offset += this.monthDays(y, i)
|
||||
}
|
||||
// 转换闰月农历 需补充该年闰月的前一个月的时差
|
||||
if (isLeapMonth) {
|
||||
offset += day
|
||||
}
|
||||
// 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
|
||||
var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
|
||||
var calObj = new Date((offset + d - 31) * 86400000 + stmap)
|
||||
var cY = calObj.getUTCFullYear()
|
||||
var cM = calObj.getUTCMonth() + 1
|
||||
var cD = calObj.getUTCDate()
|
||||
|
||||
return this.solar2lunar(cY, cM, cD)
|
||||
}
|
||||
}
|
||||
|
||||
export default calendar
|
161
uni_modules/wu-calendar/components/wu-calendar/props.js
Normal file
161
uni_modules/wu-calendar/components/wu-calendar/props.js
Normal file
@@ -0,0 +1,161 @@
|
||||
export default {
|
||||
props: {
|
||||
// 自定义当前时间
|
||||
date: {
|
||||
type: [String, Array],
|
||||
default: ''
|
||||
},
|
||||
// 日历类型(默认为month)
|
||||
type: {
|
||||
type: String,
|
||||
default: 'month',
|
||||
validator(value) {
|
||||
return ['month', 'week'].includes(value)
|
||||
}
|
||||
},
|
||||
// 日期选择模式
|
||||
mode: {
|
||||
type: String,
|
||||
default: 'single'
|
||||
},
|
||||
// 是否使用默认日期(今天,默认为true)
|
||||
useToday: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
// 是否使用折叠功能
|
||||
fold: {
|
||||
type: Boolean,
|
||||
default: null
|
||||
},
|
||||
// 主题色
|
||||
color: {
|
||||
type: String,
|
||||
default: '#3c9cff'
|
||||
},
|
||||
// 日历中每一项日期的高度(默认70),单位px
|
||||
itemHeight: {
|
||||
type: Number,
|
||||
default: 70
|
||||
},
|
||||
// 取消文字的颜色
|
||||
cancelColor: {
|
||||
type: String,
|
||||
default: '#333'
|
||||
},
|
||||
// 确定文字的颜色
|
||||
confirmColor: {
|
||||
type: String,
|
||||
default: '#333'
|
||||
},
|
||||
// mode=range时,第一个日期底部的提示文字
|
||||
startText: {
|
||||
type: String,
|
||||
default: '开始'
|
||||
},
|
||||
// mode=range时,最后一个日期底部的提示文字
|
||||
endText: {
|
||||
type: String,
|
||||
default: '结束'
|
||||
},
|
||||
// 日历以周几开始
|
||||
startWeek: {
|
||||
type: String,
|
||||
default: 'sun',
|
||||
validator(value) {
|
||||
return ['sun', 'mon'].includes(value)
|
||||
}
|
||||
},
|
||||
// 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
|
||||
selected: {
|
||||
type: Array,
|
||||
default () {
|
||||
return []
|
||||
}
|
||||
},
|
||||
// 是否显示农历
|
||||
lunar: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 日期选择范围-开始日期
|
||||
startDate: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 日期选择范围-结束日期
|
||||
endDate: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 允许日期选择范围内重选结束日期
|
||||
rangeEndRepick: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 允许日期选择范围起始日期为同一天
|
||||
rangeSameDay: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 允许日期选择范围内遇到打点禁用日期进行截断
|
||||
rangeHaveDisableTruncation: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 每月仅显示当月日期
|
||||
monthShowCurrentMonth: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 插入模式,可选值,ture:插入模式;false:弹窗模式; 默认为插入模式
|
||||
insert: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
// 滑动切换模式,可选值 horizontal: 横向 vertical:纵向 none: 不使用滑动切换
|
||||
slideSwitchMode: {
|
||||
type: String,
|
||||
default: 'horizontal'
|
||||
},
|
||||
// 是否显示月份为背景
|
||||
showMonth: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
// 弹窗模式是否清空上次选择内容
|
||||
clearDate: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
// 是否点击遮罩层关闭
|
||||
maskClick: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 是否禁止点击日历
|
||||
disabledChoice: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 弹窗日历取消和确认按钮的显示位置
|
||||
operationPosition: {
|
||||
type: String,
|
||||
default: 'top',
|
||||
validator(value) {
|
||||
return ['top', 'bottom'].includes(value)
|
||||
}
|
||||
},
|
||||
// 弹窗日历点击确认时是否需要选择完整日期
|
||||
confirmFullDate: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 当通过 `selected` 属性设置某个日期 `badgeColor`后,如果该日期被选择且主题色与 `badgeColor` 一致时,徽标会显示本颜色
|
||||
actBadgeColor: {
|
||||
type: String,
|
||||
default: '#fff'
|
||||
},
|
||||
...uni.$w?.props?.calendar
|
||||
}
|
||||
}
|
552
uni_modules/wu-calendar/components/wu-calendar/util.js
Normal file
552
uni_modules/wu-calendar/components/wu-calendar/util.js
Normal file
@@ -0,0 +1,552 @@
|
||||
import calendar from './calendar.js';
|
||||
import CALENDAR from './calendar.js'
|
||||
|
||||
class Calendar {
|
||||
constructor({
|
||||
date,
|
||||
selected,
|
||||
startDate,
|
||||
endDate,
|
||||
mode,
|
||||
monthShowCurrentMonth,
|
||||
rangeEndRepick,
|
||||
rangeSameDay,
|
||||
rangeHaveDisableTruncation,
|
||||
type,
|
||||
foldStatus,
|
||||
startWeek
|
||||
} = {}) {
|
||||
// 当前日期
|
||||
this.date = this.getDate(new Date()) // 当前初入日期
|
||||
// 打点信息
|
||||
this.selected = selected || [];
|
||||
// 范围开始
|
||||
this.startDate = startDate
|
||||
// 范围结束
|
||||
this.endDate = endDate
|
||||
// 日历以周几开始
|
||||
this.startWeek = startWeek
|
||||
// 日期选择类型
|
||||
this.mode = mode
|
||||
// 日历类型
|
||||
this.type = type
|
||||
// 折叠状态
|
||||
this.foldStatus = foldStatus
|
||||
// 允许范围内重选结束日期
|
||||
this.rangeEndRepick = rangeEndRepick
|
||||
// 允许日期选择范围起始日期为同一天
|
||||
this.rangeSameDay = rangeSameDay
|
||||
// 日期选择范围内遇到打点禁用日期是否截断
|
||||
this.rangeHaveDisableTruncation = rangeHaveDisableTruncation
|
||||
// 每月是否仅显示当月的数据
|
||||
this.monthShowCurrentMonth = monthShowCurrentMonth
|
||||
// 清理多选状态
|
||||
this.cleanRange()
|
||||
// 每周日期
|
||||
this.weeks = {}
|
||||
// 多个日期
|
||||
this.multiple = [];
|
||||
}
|
||||
/**
|
||||
* 设置日期
|
||||
* @param {Object} date
|
||||
*/
|
||||
setDate(date) {
|
||||
this.selectDate = this.getDate(date)
|
||||
this._getWeek(this.selectDate.fullDate)
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除范围
|
||||
*/
|
||||
cleanRange() {
|
||||
this.rangeStatus = {
|
||||
before: '',
|
||||
after: '',
|
||||
data: []
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除多选
|
||||
*/
|
||||
cleanMultiple() {
|
||||
this.multiple = []
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置开始日期
|
||||
*/
|
||||
resetSatrtDate(startDate) {
|
||||
// 范围开始
|
||||
this.startDate = startDate
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置结束日期
|
||||
*/
|
||||
resetEndDate(endDate) {
|
||||
// 范围结束
|
||||
this.endDate = endDate
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置是否每月仅显示当月数据
|
||||
* @param {Boolean} show 是否仅显示当月数据
|
||||
*/
|
||||
resetMonthShowCurrentMonth(show) {
|
||||
this.monthShowCurrentMonth = show
|
||||
}
|
||||
|
||||
// 重置允许范围内重选结束日期
|
||||
resetRangeEndRepick(val) {
|
||||
this.rangeEndRepick = val
|
||||
}
|
||||
|
||||
// 重置允许日期范围选择起始日期为同一天
|
||||
resetRangeSameDay(val) {
|
||||
this.rangeSameDay = val
|
||||
}
|
||||
|
||||
// 重置范围内遇到打点禁用日期是否截断
|
||||
resetRangeHaveDisableTruncation(val) {
|
||||
this.rangeHaveDisableTruncation = val
|
||||
}
|
||||
|
||||
// 重置日期选择模式
|
||||
resetMode(val) {
|
||||
this.mode = val
|
||||
}
|
||||
|
||||
// 重置折叠状态
|
||||
resetFoldStatus(val) {
|
||||
this.foldStatus = val
|
||||
}
|
||||
|
||||
// 重置日历以周几开始
|
||||
resetStartWeek(val) {
|
||||
this.startWeek = val
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建本月某一天的信息
|
||||
*/
|
||||
_createCurrentDay(nowDate, full, date) {
|
||||
// 是否今天
|
||||
let isDay = this.date.fullDate === nowDate
|
||||
// 获取打点信息
|
||||
let info = this.selected && this.selected.find((item) => {
|
||||
if (this.dateEqual(nowDate, item.date)) {
|
||||
return item
|
||||
}
|
||||
})
|
||||
|
||||
// 日期禁用
|
||||
let disableBefore = true
|
||||
let disableAfter = true
|
||||
if (this.startDate) {
|
||||
disableBefore = this.dateCompare(this.startDate, nowDate)
|
||||
}
|
||||
|
||||
if (this.endDate) {
|
||||
disableAfter = this.dateCompare(nowDate, this.endDate)
|
||||
}
|
||||
|
||||
// 范围选择模式
|
||||
let ranges = this.rangeStatus.data
|
||||
let checked = false
|
||||
if (this.mode == 'range') {
|
||||
checked = ranges.findIndex((item) => this.dateEqual(item, nowDate)) !== -1 ? true : false;
|
||||
}
|
||||
|
||||
// 多日期选择模式
|
||||
let multiples = this.multiple
|
||||
let multiplesChecked = false
|
||||
if (this.mode == 'multiple') {
|
||||
multiplesChecked = multiples.findIndex(item => this.dateEqual(item, nowDate)) !== -1;
|
||||
}
|
||||
|
||||
let data = {
|
||||
fullDate: nowDate,
|
||||
year: full.year,
|
||||
date,
|
||||
type: this.type,
|
||||
mode: this.mode,
|
||||
multiples: this.mode == 'multiple' ? multiplesChecked : false,
|
||||
rangeMultiple: this.mode == 'range' ? checked : false,
|
||||
beforeRange: this.dateEqual(this.rangeStatus.before, nowDate),
|
||||
afterRange: this.dateEqual(this.rangeStatus.after, nowDate),
|
||||
month: full.month,
|
||||
lunar: this.getlunar(full.year, full.month, date),
|
||||
disable: !(disableBefore && disableAfter),
|
||||
isDay
|
||||
}
|
||||
|
||||
|
||||
if (info) {
|
||||
data.extraInfo = info;
|
||||
data.disable = info.disable || false;
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任意时间
|
||||
*/
|
||||
getDate(date, AddDayCount = 0, str = 'day') {
|
||||
if (!date) {
|
||||
date = new Date()
|
||||
}
|
||||
if (typeof date !== 'object') {
|
||||
date = date.replace(/-/g, '/')
|
||||
}
|
||||
const dd = new Date(date)
|
||||
switch (str) {
|
||||
case 'day':
|
||||
dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
|
||||
break
|
||||
case 'month':
|
||||
if (dd.getDate() === 31 && AddDayCount > 0) {
|
||||
dd.setDate(dd.getDate() + AddDayCount)
|
||||
} else {
|
||||
const preMonth = dd.getMonth()
|
||||
dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期
|
||||
const nextMonth = dd.getMonth()
|
||||
// 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
|
||||
if (AddDayCount < 0 && preMonth !== 0 && nextMonth - preMonth > AddDayCount) {
|
||||
dd.setMonth(nextMonth + (nextMonth - preMonth + AddDayCount))
|
||||
}
|
||||
// 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
|
||||
if (AddDayCount > 0 && nextMonth - preMonth > AddDayCount) {
|
||||
dd.setMonth(nextMonth - (nextMonth - preMonth - AddDayCount))
|
||||
}
|
||||
}
|
||||
break
|
||||
case 'week':
|
||||
dd.setDate(dd.getDate() + (AddDayCount * 7))
|
||||
break;
|
||||
case 'year':
|
||||
dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
|
||||
break
|
||||
}
|
||||
const y = dd.getFullYear()
|
||||
const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
|
||||
const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
|
||||
return {
|
||||
fullDate: y + '-' + m + '-' + d,
|
||||
year: y,
|
||||
month: m,
|
||||
date: d,
|
||||
day: dd.getDay()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取上月剩余天数
|
||||
*/
|
||||
_getLastMonthDays(firstDay, full) {
|
||||
let dateArr = []
|
||||
for (let i = firstDay; i > 0; i--) {
|
||||
const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
|
||||
dateArr.push({
|
||||
date: beforeDate,
|
||||
month: full.month - 1,
|
||||
year: full.year,
|
||||
lunar: this.getlunar(full.year, full.month - 1, beforeDate),
|
||||
disable: true
|
||||
})
|
||||
}
|
||||
return dateArr
|
||||
}
|
||||
/**
|
||||
* 获取本月天数
|
||||
*/
|
||||
_currentMonthDays(dateData, full) {
|
||||
let dateArr = []
|
||||
let fullDate = this.date.fullDate
|
||||
for (let i = 1; i <= dateData; i++) {
|
||||
let nowDate = full.year + '-' + (full.month < 10 ?
|
||||
full.month : full.month) + '-' + (i < 10 ?
|
||||
'0' + i : i)
|
||||
dateArr.push(this._createCurrentDay(nowDate, full, i))
|
||||
}
|
||||
return dateArr
|
||||
}
|
||||
/**
|
||||
* 获取下月天数
|
||||
*/
|
||||
_getNextMonthDays(surplus, full) {
|
||||
let dateArr = []
|
||||
for (let i = 1; i < surplus + 1; i++) {
|
||||
dateArr.push({
|
||||
date: i,
|
||||
month: Number(full.month) + 1,
|
||||
lunar: this.getlunar(full.year, Number(full.month) + 1, i),
|
||||
disable: true
|
||||
})
|
||||
}
|
||||
return dateArr
|
||||
}
|
||||
/**
|
||||
* 获取任意日期的一周
|
||||
*/
|
||||
_getWeekDays(dateData) {
|
||||
let dateArr = [];
|
||||
let oneDayTime = 1000 * 60 * 60 * 24
|
||||
let today = new Date(dateData);
|
||||
// 获取这个日期是星期几
|
||||
let todayDay;
|
||||
let startDate;
|
||||
// 如果日历以周一开始
|
||||
if(this.startWeek == 'mon') {
|
||||
todayDay = today.getDay() || 7;
|
||||
startDate = new Date(today.getTime() - oneDayTime * (todayDay - 1));
|
||||
} else {
|
||||
todayDay = today.getDay();
|
||||
startDate = new Date(today.getTime() - oneDayTime * todayDay);
|
||||
}
|
||||
|
||||
for (let i = 0; i < 7; i++) {
|
||||
let temp = new Date(startDate.getTime() + i * oneDayTime)
|
||||
let newDate = this.getDate(`${temp.getFullYear()}-${temp.getMonth() + 1}-${temp.getDate()}`)
|
||||
dateArr.push(this._createCurrentDay(newDate.fullDate, newDate, Number(newDate.date)))
|
||||
}
|
||||
|
||||
return dateArr;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前日期详情
|
||||
* @param {Object} date
|
||||
*/
|
||||
getInfo(date) {
|
||||
if (!date) {
|
||||
date = new Date()
|
||||
}
|
||||
const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
|
||||
return dateInfo
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较时间大小
|
||||
*/
|
||||
dateCompare(startDate, endDate) {
|
||||
// 计算截止时间
|
||||
startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
|
||||
// 计算详细项的截止时间
|
||||
endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
|
||||
if (startDate <= endDate) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较时间是否相等
|
||||
*/
|
||||
dateEqual(before = '', after = '') {
|
||||
// 计算截止时间
|
||||
before = new Date(before.replace('-', '/').replace('-', '/'))
|
||||
// 计算详细项的截止时间
|
||||
after = new Date(after.replace('-', '/').replace('-', '/'))
|
||||
if (before.getTime() - after.getTime() === 0) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取日期范围内所有日期
|
||||
* @param {Object} begin
|
||||
* @param {Object} end
|
||||
*/
|
||||
getDateAll(begin, end) {
|
||||
// 找出所有打点中已禁用的部分 不让其被添加在日期选择范围内
|
||||
let disableList = this.selected.filter(item => item.date && item.disable).map(item => item.date)
|
||||
|
||||
var arr = []
|
||||
var ab = begin.split('-')
|
||||
var ae = end.split('-')
|
||||
var db = new Date()
|
||||
db.setFullYear(ab[0], ab[1] - 1, ab[2])
|
||||
var de = new Date()
|
||||
de.setFullYear(ae[0], ae[1] - 1, ae[2])
|
||||
var wuxDb = db.getTime() - 24 * 60 * 60 * 1000
|
||||
var wuxDe = de.getTime() - 24 * 60 * 60 * 1000
|
||||
for (var k = wuxDb; k <= wuxDe;) {
|
||||
k = k + 24 * 60 * 60 * 1000
|
||||
let fullDate = this.getDate(new Date(parseInt(k))).fullDate
|
||||
// 如果要在选择范围内截断日期
|
||||
if(this.rangeHaveDisableTruncation) {
|
||||
// 如果不在打点禁止列表中
|
||||
if (disableList.includes(fullDate)) return arr;
|
||||
arr.push(fullDate)
|
||||
} else {
|
||||
if (!disableList.includes(fullDate)) arr.push(fullDate);
|
||||
}
|
||||
}
|
||||
return arr
|
||||
}
|
||||
/**
|
||||
* 计算阴历日期显示
|
||||
*/
|
||||
getlunar(year, month, date) {
|
||||
return CALENDAR.solar2lunar(year, month, date)
|
||||
}
|
||||
/**
|
||||
* 设置打点
|
||||
*/
|
||||
setSelectInfo(data, value) {
|
||||
this.selected = value
|
||||
this._getWeek(data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置范围
|
||||
*/
|
||||
setRange(fullDate) {
|
||||
let {
|
||||
before,
|
||||
after
|
||||
} = this.rangeStatus;
|
||||
|
||||
// 非范围选择不再执行
|
||||
if (this.mode != 'range') return
|
||||
|
||||
// 判断目前的日期 是否 比before日期小或者等于before日期 如果为true就要重置
|
||||
let reset = this.dateCompare(fullDate, before);
|
||||
// 如果日期选择范围允许为同一天 且 目前是需要重置的
|
||||
if (this.rangeSameDay && before && reset) {
|
||||
// 判断是否需要相等 如果 不相等 则 重置 如果相等 则不重置
|
||||
reset = !this.dateEqual(fullDate, before);
|
||||
}
|
||||
|
||||
if ((before && after || reset) && (!this.rangeEndRepick || (this.rangeEndRepick && this.rangeStatus.data
|
||||
.indexOf(fullDate) == -1))) {
|
||||
this.rangeStatus.before = fullDate;
|
||||
this.rangeStatus.after = '';
|
||||
this.rangeStatus.data = [];
|
||||
} else {
|
||||
if (!before) {
|
||||
this.rangeStatus.before = fullDate
|
||||
} else {
|
||||
if (this.dateCompare(this.rangeStatus.before, fullDate)) {
|
||||
this.rangeStatus.data = this.getDateAll(this.rangeStatus.before, fullDate);
|
||||
} else {
|
||||
this.rangeStatus.data = this.getDateAll(fullDate, this.rangeStatus.before);
|
||||
}
|
||||
this.rangeStatus.after = this.rangeStatus.data[this.rangeStatus.data.length - 1]
|
||||
}
|
||||
}
|
||||
this._getWeek(fullDate)
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置多选
|
||||
*/
|
||||
setMultiple(fullDate) {
|
||||
// 非多选不再执行
|
||||
if (this.mode != 'multiple') return
|
||||
// 检查是否已经多选
|
||||
let index = this.multiple.findIndex((item) => {
|
||||
if (this.dateEqual(fullDate, item)) {
|
||||
return item
|
||||
}
|
||||
});
|
||||
if (index === -1) {
|
||||
this.multiple.push(fullDate)
|
||||
this.setDate(fullDate)
|
||||
} else {
|
||||
this.multiple = this.multiple.filter((item, i) => i != index)
|
||||
}
|
||||
this._getWeek(fullDate)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取每周数据
|
||||
* @param {Object} dateData
|
||||
*/
|
||||
_getWeek(dateData, useWeeks = true) {
|
||||
const {
|
||||
year,
|
||||
month
|
||||
} = this.getDate(dateData)
|
||||
|
||||
let weeks = {}
|
||||
// 日历数据
|
||||
let canlender = [];
|
||||
|
||||
if (this.foldStatus === 'open') {
|
||||
// 默认以周末开始
|
||||
let firstDay = new Date(year, month - 1, 1).getDay();
|
||||
// 如果以周一开始
|
||||
if(this.startWeek === 'mon') {
|
||||
firstDay = firstDay === 0 ? 6 : firstDay - 1;
|
||||
}
|
||||
let currentDay = new Date(year, month, 0).getDate()
|
||||
// 日期数据
|
||||
let dates = {
|
||||
lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
|
||||
currentMonthDys: this._currentMonthDays(currentDay, this.getDate(dateData)), // 本月天数
|
||||
weeks: []
|
||||
}
|
||||
// 下月开始几天
|
||||
const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
|
||||
dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
|
||||
|
||||
// 如果仅显示当月
|
||||
if (this.monthShowCurrentMonth) {
|
||||
// 日历数据
|
||||
canlender = canlender.concat(
|
||||
dates.lastMonthDays.map(item => item = {
|
||||
empty: true,
|
||||
lunar: {},
|
||||
}),
|
||||
dates.currentMonthDys,
|
||||
dates.nextMonthDays.map(item => item = {
|
||||
empty: true,
|
||||
lunar: {},
|
||||
}),
|
||||
);
|
||||
|
||||
} else {
|
||||
// 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天
|
||||
canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
|
||||
}
|
||||
|
||||
} else {
|
||||
canlender = this._getWeekDays(dateData)
|
||||
}
|
||||
|
||||
for (let i = 0; i < canlender.length; i++) {
|
||||
if (i % 7 === 0) {
|
||||
weeks[parseInt(i / 7)] = new Array(7)
|
||||
}
|
||||
weeks[parseInt(i / 7)][i % 7] = canlender[i] || {};
|
||||
}
|
||||
|
||||
if (useWeeks) {
|
||||
this.canlender = canlender
|
||||
this.weeks = weeks
|
||||
}
|
||||
|
||||
return weeks
|
||||
}
|
||||
|
||||
|
||||
//静态方法
|
||||
// static init(date) {
|
||||
// if (!this.instance) {
|
||||
// this.instance = new Calendar(date);
|
||||
// }
|
||||
// return this.instance;
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
export default Calendar
|
1057
uni_modules/wu-calendar/components/wu-calendar/wu-calendar.vue
Normal file
1057
uni_modules/wu-calendar/components/wu-calendar/wu-calendar.vue
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user