import { validate } from '../string'; export { createRangeDate } from './createRangeDate'; export { getDaysInDate } from './getDaysInDate'; export interface Value { readonly value: V; readonly label: string; } /** * 日期模式 * 参考:https://www.zhihu.com/question/23730083 */ export type Mode = ( 'ss' | 'mm' | 'HH' | 'dd' | 'MM' | 'yy' | 'HHmm' | 'mmss' | 'HHmmss' | 'ddHHmmss' | 'MMddHHmmss' | 'yyMMddHHmmss' | 'yyMM' | 'yyMMdd' | 'yyMMddHH' | 'yyMMddHHmm' | 'auto' ); export interface ReturnObject { time: number; day: number; hour: number; min: number; sec: number; } export const SEC = 1000; export const MIN = 60 * SEC; export const HOUR = 60 * MIN; export const DAY = 24 * HOUR; export const MINMONTH = 28 * DAY; export const MINYEAR = 365 * DAY; /** 对IOS new Date的兼容 */ export function newDate(date: string | number): Date { if (typeof date === 'string') { if (validate.number(date)) { return new Date(Number(date)); } else { return new Date(date.replace(/\-/g, '/')); } } return new Date(date); } export function leftPad(n: number): string { return n < 10 ? `0${n}` : n + ''; } export function getTime(len: 10 | 13 = 10) { return parseInt(Date.now().toString().substring(0, len)); } function getValue(value: Value): string { return leftPad(parseFloat(value.value as unknown as string)); } export function pickerValueFormat(value: Value[], mode: Extract): string { if (value.length > 0) { switch (mode) { case 'yyMM': return `${value[0].value}-${getValue(value[1])}`; case 'yyMMdd': return `${value[0].value}-${getValue(value[1])}-${getValue(value[2])}`; case 'yyMMddHHmm': return `${value[0].value}-${getValue(value[1])}-${getValue(value[2])} ${getValue(value[3])}:${getValue(value[4])}`; default: return ''; } } return ''; } function isValueType(value: unknown): value is Value[] { return Array.isArray(value); } export function dateformat(date: Value[], mode: Extract, useLeftPad?: boolean): string export function dateformat(date: string | number | Date, mode: Mode, useLeftPad?: boolean): string export function dateformat(date: string | number | Date | Value[], mode: Mode, useLeftPad?: boolean): string { const type = typeof date; let newdate: Date; if (type === 'string') { newdate = newDate(date as string); } else if (type === 'number') { newdate = new Date(date as number); } else if (isValueType(date)) { return pickerValueFormat(date, mode as Extract); } else { newdate = date as Date; } const newTime = newdate.getTime(); const year = useLeftPad ? leftPad(newdate.getFullYear()) : newdate.getFullYear(); const month = useLeftPad ? leftPad(newdate.getMonth() + 1) : newdate.getMonth() + 1; const day = useLeftPad ? leftPad(newdate.getDate()) : newdate.getDate(); const hour = useLeftPad ? leftPad(newdate.getHours()) : newdate.getHours(); const min = useLeftPad ? leftPad(newdate.getMinutes()) : newdate.getMinutes(); const sec = useLeftPad ? leftPad(newdate.getSeconds()) : newdate.getSeconds(); const isAuto = mode === 'auto'; let str = ''; if (mode.indexOf('yy') >= 0 || (isAuto && newTime > MINYEAR)) { str += year.toString(); } if (mode.indexOf('MM') >= 0 || (isAuto && newTime > MINMONTH)) { str += str ? '-' + month : month.toString(); } if (mode.indexOf('dd') >= 0 || (isAuto && newTime > DAY)) { str += str ? '-' + day : day.toString(); } if (mode.indexOf('HH') >= 0 || (isAuto && newTime > HOUR)) { str += str ? ' ' + hour : hour.toString(); } if (mode.indexOf('mm') >= 0 || (isAuto && newTime > MIN)) { str += str ? ':' + min : min.toString(); } if (mode.indexOf('ss') >= 0 || (isAuto && newTime > SEC)) { str += str ? ':' + sec : sec.toString(); } return str; } export function dateformatReturnObject(date: string | number | Date | Value[]): ReturnObject { const type = typeof date; let newdate: Date; if (type === 'string') { newdate = newDate(date as string); } else if (type === 'number') { newdate = new Date(date as number); } else { newdate = date as Date; } const newTime = newdate.getTime(); const day = Math.floor(newTime / DAY); const dayRemainder = newTime - day * DAY; const hour = dayRemainder > 0 ? Math.floor(dayRemainder / HOUR) : 0; const hourRemainder = dayRemainder - hour * HOUR; const min = hourRemainder > 0 ? Math.floor(hourRemainder / MIN) : 0; const minRemainde = hourRemainder - min * MIN; const sec = minRemainde > 0 ? Math.floor(minRemainde / SEC) : 0; return { time: newTime, day, hour, min, sec }; }