You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

425 lines
9.5 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { getType, padZero } from '../common/util'
const weeks: string[] = ['日', '一', '二', '三', '四', '五', '六']
/**
* 比较两个时间的日期是否相等
* @param {timestamp} date1
* @param {timestamp} date2
*/
export function compareDate(date1, date2) {
date1 = new Date(date1)
date2 = new Date(date2)
const year1 = date1.getFullYear()
const year2 = date2.getFullYear()
const month1 = date1.getMonth()
const month2 = date2.getMonth()
const day1 = date1.getDate()
const day2 = date2.getDate()
if (year1 === year2) {
if (month1 === month2) {
return day1 === day2 ? 0 : day1 > day2 ? 1 : -1
}
return month1 === month2 ? 0 : month1 > month2 ? 1 : -1
}
return year1 > year2 ? 1 : -1
}
/**
* 判断是否是范围选择
* @param {string} type
*/
export function isRange(type) {
return type.indexOf('range') > -1
}
/**
* 比较两个日期的月份是否相等
* @param {timestamp} date1
* @param {timestamp} date2
*/
export function compareMonth(date1, date2) {
date1 = new Date(date1)
date2 = new Date(date2)
const year1 = date1.getFullYear()
const year2 = date2.getFullYear()
const month1 = date1.getMonth()
const month2 = date2.getMonth()
if (year1 === year2) {
return month1 === month2 ? 0 : month1 > month2 ? 1 : -1
}
return year1 > year2 ? 1 : -1
}
/**
* 比较两个日期的年份是否一致
* @param {timestamp} date1
* @param {timestamp} date2
*/
export function compareYear(date1, date2) {
date1 = new Date(date1)
date2 = new Date(date2)
const year1 = date1.getFullYear()
const year2 = date2.getFullYear()
return year1 === year2 ? 0 : year1 > year2 ? 1 : -1
}
/**
* 获取一个月的最后一天
* @param {number} year
* @param {number} month
*/
export function getMonthEndDay(year, month) {
return 32 - new Date(year, month - 1, 32).getDate()
}
/**
* 格式化年月
* @param {timestamp} date
*/
export function formatMonthTitle(date) {
date = new Date(date)
const year = date.getFullYear()
const month = date.getMonth() + 1
return year + '年' + month + '月'
}
/**
* 根据下标获取星期
* @param {number} index
*/
export function getWeekLabel(index) {
if (index >= 7) {
index = index % 7
}
return weeks[index]
}
/**
* 获取一个月第一天的样式
* @param {number} index
* @param {timestamp} date
* @param {number} firstDayOfWeek
*/
export function getFirstDayStyle(index: number, date: number, firstDayOfWeek: number) {
if (firstDayOfWeek >= 7) {
firstDayOfWeek = firstDayOfWeek % 7
}
if (index !== 0) return ''
const offset = (7 + new Date(date).getDay() - firstDayOfWeek) % 7
return 'margin-left: ' + (100 / 7) * offset + '%'
}
/**
* 格式化年份
* @param {timestamp} date
*/
export function formatYearTitle(date: number) {
const year = new Date(date).getFullYear()
return year + '年'
}
/**
* 根据最小日期和最大日期获取这之间总共有几个月份
* @param {timestamp} minDate
* @param {timestamp} maxDate
*/
export function getMonths(minDate, maxDate) {
const months: number[] = []
const month = new Date(minDate)
month.setDate(1)
while (compareMonth(month, maxDate) < 1) {
months.push(month.getTime())
month.setMonth(month.getMonth() + 1)
}
return months
}
/**
* 根据最小日期和最大日期获取这之间总共有几年
* @param {timestamp} minDate
* @param {timestamp} maxDate
*/
export function getYears(minDate: number, maxDate: number) {
const years: number[] = []
const year = new Date(minDate)
year.setMonth(0)
year.setDate(1)
while (compareYear(year, maxDate) < 1) {
years.push(year.getTime())
year.setFullYear(year.getFullYear() + 1)
}
return years
}
/**
* 获取一个日期所在周的第一天和最后一天
* @param {timestamp} date
*/
export function getWeekRange(date, firstDayOfWeek) {
if (firstDayOfWeek >= 7) {
firstDayOfWeek = firstDayOfWeek % 7
}
date = new Date(date)
date.setHours(0, 0, 0, 0)
const year = date.getFullYear()
const month = date.getMonth()
const day = date.getDate()
const week = date.getDay()
const weekStart = new Date(year, month, day - ((7 + week - firstDayOfWeek) % 7))
const weekEnd = new Date(year, month, day + 6 - ((7 + week - firstDayOfWeek) % 7))
return [weekStart.getTime(), weekEnd.getTime()]
}
/**
* 获取日期偏移量
* @param {timestamp} date1
* @param {timestamp} date2
*/
export function getDayOffset(date1, date2) {
return (date1 - date2) / (24 * 60 * 60 * 1000) + 1
}
/**
* 获取偏移日期
* @param {timestamp} date
* @param {number} offset
*/
export function getDayByOffset(date, offset) {
date = new Date(date)
date.setDate(date.getDate() + offset)
return date.getTime()
}
/**
* 获取月份偏移量
* @param {timestamp} date1
* @param {timestamp} date2
*/
export function getMonthOffset(date1, date2) {
date1 = new Date(date1)
date2 = new Date(date2)
const year1 = date1.getFullYear()
const year2 = date2.getFullYear()
let month1 = date1.getMonth()
const month2 = date2.getMonth()
month1 = (year1 - year2) * 12 + month1
return month1 - month2 + 1
}
/**
* 获取偏移月份
* @param {timestamp} date
* @param {number} offset
*/
export function getMonthByOffset(date, offset) {
date = new Date(date)
date.setMonth(date.getMonth() + offset)
return date.getTime()
}
/**
* 获取默认时间,格式化为数组
* @param {array|string|null} defaultTime
*/
export function getDefaultTime(defaultTime) {
if (getType(defaultTime) === 'array') {
const startTime = (defaultTime[0] || '00:00:00').split(':').map((item) => {
return parseInt(item)
})
const endTime = (defaultTime[1] || '00:00:00').split(':').map((item) => {
return parseInt(item)
})
return [startTime, endTime]
} else {
const time = (defaultTime || '00:00:00').split(':').map((item) => {
return parseInt(item)
})
return [time, time]
}
}
/**
* 根据默认时间获取日期
* @param {timestamp} date
* @param {array} defaultTime
*/
export function getDateByDefaultTime(date, defaultTime) {
date = new Date(date)
date.setHours(defaultTime[0])
date.setMinutes(defaultTime[1])
date.setSeconds(defaultTime[2])
return date.getTime()
}
/**
* 获取经过 iteratee 格式化后的长度为 n 的数组
* @param {number} n
* @param {function} iteratee
*/
const times = (n, iteratee) => {
let index = -1
const result = Array(n < 0 ? 0 : n)
while (++index < n) {
result[index] = iteratee(index)
}
return result
}
/**
* 获取时分秒
* @param {timestamp}} date
*/
const getTime = (date) => {
date = new Date(date)
return [date.getHours(), date.getMinutes(), date.getSeconds()]
}
/**
* 根据最小最大日期获取时间数据用于填入picker
* @param {*} param0
*/
export function getTimeData({ date, minDate, maxDate, isHideSecond, filter } = {} as any) {
const compareMin = compareDate(date, minDate)
const compareMax = compareDate(date, maxDate)
let minHour = 0
let maxHour = 23
let minMinute = 0
let maxMinute = 59
let minSecond = 0
let maxSecond = 59
if (compareMin === 0) {
const minTime = getTime(minDate)
const currentTime = getTime(date)
minHour = minTime[0]
if (minTime[0] === currentTime[0]) {
minMinute = minTime[1]
if (minTime[1] === currentTime[1]) {
minSecond = minTime[2]
}
}
}
if (compareMax === 0) {
const maxTime = getTime(maxDate)
const currentTime = getTime(date)
maxHour = maxTime[0]
if (maxTime[0] === currentTime[0]) {
maxMinute = maxTime[1]
if (maxTime[1] === currentTime[1]) {
maxSecond = maxTime[2]
}
}
}
let columns: any[] = []
let hours = times(24, (index) => {
return {
label: `${padZero(index)}`,
value: index,
disabled: index < minHour || index > maxHour
}
})
let minutes = times(60, (index) => {
return {
label: `${padZero(index)}`,
value: index,
disabled: index < minMinute || index > maxMinute
}
})
let seconds
if (filter && getType(filter) === 'function') {
hours = filter({
type: 'hour',
values: hours
})
minutes = filter({
type: 'minute',
values: minutes
})
}
if (!isHideSecond) {
seconds = times(60, (index) => {
return {
label: `${padZero(index)}`,
value: index,
disabled: index < minSecond || index > maxSecond
}
})
if (filter && getType(filter) === 'function') {
seconds = filter({
type: 'second',
values: seconds
})
}
}
columns = isHideSecond ? [hours, minutes] : [hours, minutes, seconds]
return columns
}
/**
* 获取当前是第几周
* @param {timestamp} date
*/
export function getWeekNumber(date) {
date = new Date(date)
date.setHours(0, 0, 0, 0)
// Thursday in current week decides the year.
date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7))
// January 4 is always in week 1.
const week = new Date(date.getFullYear(), 0, 4)
// Adjust to Thursday in week 1 and count number of weeks from date to week 1.
// Rounding should be fine for Daylight Saving Time. Its shift should never be more than 12 hours.
return 1 + Math.round(((date.getTime() - week.getTime()) / 86400000 - 3 + ((week.getDay() + 6) % 7)) / 7)
}
export function getItemClass(monthType, value, type) {
const classList = ['is-' + monthType]
if (type.indexOf('range') > -1) {
if (!value || !value[1]) {
classList.push('is-without-end')
}
}
return classList.join(' ')
}