wot-design
Version:
Mobile UI components built on vue.js
364 lines (310 loc) • 8.6 kB
JavaScript
import { getType, padZero } from 'wot-design/src/utils'
/**
* 比较两个时间的日期是否相等
* @param {Date} date1
* @param {Date} date2
*/
export function compareDate (date1, date2) {
if (!date1) return -1
if (!date2) return 1
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 {Date} date1
* @param {Date} date2
*/
export function compareMonth (date1, date2) {
if (!date1) return -1
if (!date2) return 1
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 {Date} date1
* @param {Date} date2
*/
export function compareYear (date1, 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 {Date} minDate
* @param {Date} maxDate
*/
export function getMonths (minDate, maxDate) {
const months = []
const month = new Date(minDate.getTime())
month.setDate(1)
while (compareMonth(month, maxDate) < 1) {
months.push(new Date(month.getTime()))
month.setMonth(month.getMonth() + 1)
}
return months
}
/**
* 根据最小日期和最大日期获取这之间总共有几年
* @param {Date} minDate
* @param {Date} maxDate
*/
export function getYears (minDate, maxDate) {
const years = []
const year = new Date(minDate.getTime())
year.setMonth(0)
year.setDate(1)
while (compareYear(year, maxDate) < 1) {
years.push(new Date(year.getTime()))
year.setFullYear(year.getFullYear() + 1)
}
return years
}
/**
* 获取一个日期所在周的第一天和最后一天
* @param {Date} date
*/
export function getWeekRange (date, firstDayOfWeek) {
if (firstDayOfWeek >= 7) {
firstDayOfWeek = firstDayOfWeek % 7
}
date = new Date(date.getTime())
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, weekEnd]
}
/**
* 获取日期偏移量
* @param {Date} date1
* @param {Date} date2
*/
export function getDayOffset (date1, date2) {
return (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000) + 1
}
/**
* 获取偏移日期
* @param {Date} date
* @param {number} offset
*/
export function getDayByOffset (date, offset) {
date = new Date(date.getTime())
date.setDate(date.getDate() + offset)
return date
}
export function getWeekOffset (date1, date2) {
return (date1.getTime() - date2.getTime()) / (7 * 24 * 60 * 60 * 1000) + 1
}
export function getWeekByOffset (date, offset) {
date = new Date(date.getTime())
date.setDate(date.getDate() + offset * 7)
return date
}
/**
* 获取月份偏移量
* @param {Date} date1
* @param {Date} date2
*/
export function getMonthOffset (date1, 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 {Date} date
* @param {number} offset
*/
export function getMonthByOffset (date, offset) {
date = new Date(date.getTime())
date.setMonth(date.getMonth() + offset)
return date
}
/**
* 获取默认时间,格式化为数组
* @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 {Date} date
* @param {array} defaultTime
*/
export function getDateByDefaultTime (date, defaultTime) {
date = new Date(date.getTime())
date.setHours(defaultTime[0])
date.setMinutes(defaultTime[1])
date.setSeconds(defaultTime[2])
return date
}
/**
* 获取经过 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 {Date} date
*/
const getTime = (date) => {
return [date.getHours(), date.getMinutes(), date.getSeconds()]
}
/**
* 根据最小最大日期获取时间数据,用于填入picker
* @param {*} param0
*/
export function getTimeData ({ date, minDate, maxDate, isHideSecond, filter } = {}) {
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 = []
let hours = times(24, index => {
return {
label: this.t('wd.calendarView.hour', { value: padZero(index) }),
value: index,
disabled: index < minHour || index > maxHour
}
})
let minutes = times(60, index => {
return {
label: this.t('wd.calendarView.minute', { value: 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: this.t('wd.calendarView.second', { value: 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 {Date} date
*/
export function getWeekNumber (date) {
date = new Date(date.getTime())
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 dateToTimestamp (value) {
if (value instanceof Array) {
return value.map((item) => {
return item && item.getTime ? item.getTime() : item
})
}
return value && value.getTime ? value.getTime() : value
}