|
|
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(' ')
|
|
|
}
|