| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 |
- import { computed } from 'vue'
- import dayjs from '../../dayjs'
- import { isArray, isFunction, padZero } from '../common/util'
- import { useTranslate } from '../composables/useTranslate'
- import type { CalendarDayType, CalendarItem, CalendarTimeFilter, CalendarType } from './types'
- const { translate } = useTranslate('calendar-view')
- const weeks = computed(() => {
- return [
- translate('weeks.sun'),
- translate('weeks.mon'),
- translate('weeks.tue'),
- translate('weeks.wed'),
- translate('weeks.thu'),
- translate('weeks.fri'),
- translate('weeks.sat')
- ]
- })
- /**
- * 比较两个时间的日期是否相等
- * @param {timestamp} date1
- * @param {timestamp} date2
- */
- export function compareDate(date1: number, date2: number | null) {
- const dateValue1 = new Date(date1)
- const dateValue2 = new Date(date2 || '')
- const year1 = dateValue1.getFullYear()
- const year2 = dateValue2.getFullYear()
- const month1 = dateValue1.getMonth()
- const month2 = dateValue2.getMonth()
- const day1 = dateValue1.getDate()
- const day2 = dateValue2.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: CalendarType) {
- return type.indexOf('range') > -1
- }
- /**
- * 比较两个日期的月份是否相等
- * @param {timestamp} date1
- * @param {timestamp} date2
- */
- export function compareMonth(date1: number, date2: number) {
- const dateValue1 = new Date(date1)
- const dateValue2 = new Date(date2)
- const year1 = dateValue1.getFullYear()
- const year2 = dateValue2.getFullYear()
- const month1 = dateValue1.getMonth()
- const month2 = dateValue2.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: number, date2: number) {
- const dateValue1 = new Date(date1)
- const dateValue2 = new Date(date2)
- const year1 = dateValue1.getFullYear()
- const year2 = dateValue2.getFullYear()
- return year1 === year2 ? 0 : year1 > year2 ? 1 : -1
- }
- /**
- * 获取一个月的最后一天
- * @param {number} year
- * @param {number} month
- */
- export function getMonthEndDay(year: number, month: number) {
- return 32 - new Date(year, month - 1, 32).getDate()
- }
- /**
- * 格式化年月
- * @param {timestamp} date
- */
- export function formatMonthTitle(date: number) {
- return dayjs(date).format(translate('monthTitle'))
- }
- /**
- * 根据下标获取星期
- * @param {number} index
- */
- export function getWeekLabel(index: number) {
- if (index >= 7) {
- index = index % 7
- }
- return weeks.value[index]
- }
- /**
- * 格式化年份
- * @param {timestamp} date
- */
- export function formatYearTitle(date: number) {
- return dayjs(date).format(translate('yearTitle'))
- }
- /**
- * 根据最小日期和最大日期获取这之间总共有几个月份
- * @param {timestamp} minDate
- * @param {timestamp} maxDate
- */
- export function getMonths(minDate: number, maxDate: number) {
- const months: number[] = []
- const month = new Date(minDate)
- month.setDate(1)
- while (compareMonth(month.getTime(), 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.getTime(), maxDate) < 1) {
- years.push(year.getTime())
- year.setFullYear(year.getFullYear() + 1)
- }
- return years
- }
- /**
- * 获取一个日期所在周的第一天和最后一天
- * @param {timestamp} date
- */
- export function getWeekRange(date: number, firstDayOfWeek: number) {
- if (firstDayOfWeek >= 7) {
- firstDayOfWeek = firstDayOfWeek % 7
- }
- const dateValue = new Date(date)
- dateValue.setHours(0, 0, 0, 0)
- const year = dateValue.getFullYear()
- const month = dateValue.getMonth()
- const day = dateValue.getDate()
- const week = dateValue.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: number, date2: number) {
- return (date1 - date2) / (24 * 60 * 60 * 1000) + 1
- }
- /**
- * 获取偏移日期
- * @param {timestamp} date
- * @param {number} offset
- */
- export function getDayByOffset(date: number, offset: number) {
- const dateValue = new Date(date)
- dateValue.setDate(dateValue.getDate() + offset)
- return dateValue.getTime()
- }
- export const getPrevDay = (date: number) => getDayByOffset(date, -1)
- export const getNextDay = (date: number) => getDayByOffset(date, 1)
- /**
- * 获取月份偏移量
- * @param {timestamp} date1
- * @param {timestamp} date2
- */
- export function getMonthOffset(date1: number, date2: number) {
- const dateValue1 = new Date(date1)
- const dateValue2 = new Date(date2)
- const year1 = dateValue1.getFullYear()
- const year2 = dateValue2.getFullYear()
- let month1 = dateValue1.getMonth()
- const month2 = dateValue2.getMonth()
- month1 = (year1 - year2) * 12 + month1
- return month1 - month2 + 1
- }
- /**
- * 获取偏移月份
- * @param {timestamp} date
- * @param {number} offset
- */
- export function getMonthByOffset(date: number, offset: number) {
- const dateValue = new Date(date)
- dateValue.setMonth(dateValue.getMonth() + offset)
- return dateValue.getTime()
- }
- /**
- * 获取默认时间,格式化为数组
- * @param {array|string|null} defaultTime
- */
- export function getDefaultTime(defaultTime: string[] | string | null) {
- if (isArray(defaultTime)) {
- const startTime = (defaultTime[0] || '00:00:00').split(':').map((item: string) => {
- 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: number, defaultTime: number[]) {
- const dateValue = new Date(date)
- dateValue.setHours(defaultTime[0])
- dateValue.setMinutes(defaultTime[1])
- dateValue.setSeconds(defaultTime[2])
- return dateValue.getTime()
- }
- /**
- * 获取经过 iteratee 格式化后的长度为 n 的数组
- * @param {number} n
- * @param {function} iteratee
- */
- const times = (n: number, iteratee: (index: number) => CalendarItem) => {
- let index: number = -1
- const result: CalendarItem[] = Array(n < 0 ? 0 : n)
- while (++index < n) {
- result[index] = iteratee(index)
- }
- return result
- }
- /**
- * 获取时分秒
- * @param {timestamp}} date
- */
- const getTime = (date: number) => {
- const dateValue = new Date(date)
- return [dateValue.getHours(), dateValue.getMinutes(), dateValue.getSeconds()]
- }
- /**
- * 根据最小最大日期获取时间数据,用于填入picker
- * @param {*} param0
- */
- export function getTimeData({
- date,
- minDate,
- maxDate,
- isHideSecond,
- filter
- }: {
- date: number
- minDate: number
- maxDate: number
- isHideSecond: boolean
- filter?: CalendarTimeFilter
- }) {
- 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: CalendarItem[][] = []
- let hours = times(24, (index) => {
- return {
- label: translate('hour', padZero(index)),
- value: index,
- disabled: index < minHour || index > maxHour
- }
- })
- let minutes = times(60, (index) => {
- return {
- label: translate('minute', padZero(index)),
- value: index,
- disabled: index < minMinute || index > maxMinute
- }
- })
- let seconds: CalendarItem[] = []
- if (filter && isFunction(filter)) {
- hours = filter({
- type: 'hour',
- values: hours
- })
- minutes = filter({
- type: 'minute',
- values: minutes
- })
- }
- if (!isHideSecond) {
- seconds = times(60, (index) => {
- return {
- label: translate('second', padZero(index)),
- value: index,
- disabled: index < minSecond || index > maxSecond
- }
- })
- if (filter && isFunction(filter)) {
- seconds = filter({
- type: 'second',
- values: seconds
- })
- }
- }
- columns = isHideSecond ? [hours, minutes] : [hours, minutes, seconds]
- return columns
- }
- /**
- * 获取当前是第几周
- * @param {timestamp} date
- */
- export function getWeekNumber(date: number | 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: CalendarDayType, value: number | null | (number | null)[], type: CalendarType) {
- const classList = ['is-' + monthType]
- if (type.indexOf('range') > -1 && isArray(value)) {
- if (!value || !value[1]) {
- classList.push('is-without-end')
- }
- }
- return classList.join(' ')
- }
|