2024-03-16 14:11:43 +08:00

221 lines
6.0 KiB
JavaScript

import moment from 'moment';
moment.defineLocale('zh-cn', {
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
longDateFormat: {
LT: 'HH:mm',
LTS: 'HH:mm:ss',
L: 'YYYY/MM/DD',
LL: 'YYYY年M月D日',
LLL: 'YYYY年M月D日Ah点mm分',
LLLL: 'YYYY年M月D日ddddAh点mm分',
l: 'YYYY/M/D',
ll: 'YYYY年M月D日',
lll: 'YYYY年M月D日 HH:mm',
llll: 'YYYY年M月D日dddd HH:mm'
},
meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
meridiemHour: function (hour, meridiem) {
if (hour === 12) {
hour = 0;
}
if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
return hour;
}
else if (meridiem === '下午' || meridiem === '晚上') {
return hour + 12;
}
else {
// '中午'
return hour >= 11 ? hour : hour + 12;
}
},
meridiem: function (hour, minute, isLower) {
let hm = hour * 100 + minute;
if (hm < 600) {
return '凌晨';
}
else if (hm < 900) {
return '早上';
}
else if (hm < 1130) {
return '上午';
}
else if (hm < 1230) {
return '中午';
}
else if (hm < 1800) {
return '下午';
}
else {
return '晚上';
}
},
calendar: {
sameDay: '[今天]LT',
nextDay: '[明天]LT',
nextWeek: '[下]ddddLT',
lastDay: '[昨天]LT',
lastWeek: '[上]ddddLT',
sameElse: 'L'
},
dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/,
ordinal: function (numberVal, period) {
switch (period) {
case 'd':
case 'D':
case 'DDD':
return numberVal + '日';
case 'M':
return numberVal + '月';
case 'w':
case 'W':
return numberVal + '周';
default:
return numberVal;
}
},
relativeTime: {
future: '%s内',
past: '%s前',
s: '几秒',
ss: '%d 秒',
m: '1 分钟',
mm: '%d 分钟',
h: '1 小时',
hh: '%d 小时',
d: '1 天',
dd: '%d 天',
M: '1 个月',
MM: '%d 个月',
y: '1 年',
yy: '%d 年'
},
week: {
// GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
dow: 1,
doy: 4 // The week that contains Jan 4th is the first week of the year.
}
});
const ROWS_OF_CALENDAR = 6;
const DAYS_OF_A_WEEK = 7;
/**
* 获取日历面板
* 参数为某天的日期
*/
function getCalendar(date) {
const firstDate = date.clone().date(1);
const firstWeek = getAWeek(firstDate);
const nextMonthFirstDate = firstDate.clone().add(1, 'months');
const lastDate = nextMonthFirstDate.clone().date(0);
const lastWeek = getAWeek(lastDate);
const ret = [firstWeek];
let i;
for (i = 1; i < ROWS_OF_CALENDAR; i++) {
let sunday = firstDate.clone().day(0).day(i * DAYS_OF_A_WEEK);
if (sunday.isBefore(lastWeek[0].dateModel)) {
ret.push(getAWeek(sunday));
}
else {
ret.push(lastWeek);
break;
}
}
let j;
for (j = ret.length; j < ROWS_OF_CALENDAR; j++) {
let sunday = firstDate.clone().day(0).day(j * DAYS_OF_A_WEEK);
ret.push(getAWeek(sunday));
}
return ret;
}
/**
* 获取某天所在的一周
*/
function getAWeek(date) {
const week = [];
range(DAYS_OF_A_WEEK).forEach((i) => {
week.push(new ViewDate({
dateModel: date.clone().day(i),
}));
});
return week;
}
/**
* ViewDate 类型
* 该类型对象的 dateModel 属性为一个 moment 类型对象
* 对 moment 进行一次封装,方便扩展属性
*/
function ViewDate(options) {
this.dateModel = options.dateModel;
this.formattedDate = this.dateModel.format('YYYY-MM-DD');
}
/**
* 获取星期的文案
* ['日', '一', '二', ....]
*/
function getWeekdays(calendar) {
const week = calendar[0];
const ret = [];
return week.map((item) => {
return moment.weekdaysMin(item.dateModel.day());
});
}
function changeDate(date, type, method) {
date = date.clone();
date[method](1, type);
return date;
}
function range(count) {
const list = [];
let i;
for (i = 0; i < count; i++) {
list.push(i);
}
return list;
}
/**
* CalendarDecorator
* 对日历面板进行统一的属性扩展工具
*/
const CalendarDecorator = {
trigger(calendar) {
const flatList = calendar.reduce((accumulate, item) => {
return accumulate.concat(item);
}, []);
return (decorator) => {
flatList.forEach((item) => {
decorator(item);
});
return calendar;
};
},
decorator: {
targetMonth(date, item) {
if (!date.isSame(item.dateModel, 'month')) {
item.targetMonth = false;
}
else {
item.targetMonth = true;
}
},
disabled(startDate, endDate, item) {
if ((startDate && item.dateModel.isBefore(startDate)) ||
(endDate && item.dateModel.isAfter(endDate))) {
item.disabled = true;
}
else {
item.disabled = false;
}
}
}
};
export default {
CalendarDecorator,
getCalendar,
getWeekdays,
changeDate
};
//# sourceMappingURL=utils.js.map