date
日期处理工具,包含日期解析、格式化、比较、时区等功能。
导入
import {
isValidDate,
dateParse,
dateFormat,
dateRelative,
isLeapYear,
isSameDateInYear,
isSameDateInMonth,
isSameDateInDay,
isSameDateInHour,
isSameDateInMinute,
isSameDateInSecond,
dateDaysInMonth,
dateDaysInYear,
weeksOfYear,
weeksOfMonth,
dateStartInSecond,
dateStartInMinute,
dateStartInHour,
dateStartInDay,
dateStartInWeek,
dateStartInMonth,
dateStartInYear,
dateEndInSecond,
dateEndInMinute,
dateEndInHour,
dateEndInDay,
dateEndInWeek,
dateEndInMonth,
dateEndInYear,
TimezoneDate,
// 类型
type DateLike,
type DateValue,
type DateRelativeTemplate,
type DateRelativeTemplates,
type TimezoneDateOptions,
// 常量
DATE_SECOND_MS,
DATE_MINUTE_MS,
DATE_HOUR_MS,
DATE_DAY_MS,
DATE_MONTH_MS,
DATE_YEAR_MS
} from '@cloudcome/utils-core/date'类型定义
DateLike
type DateLike = Date | TimezoneDateDateValue
type DateValue = number | string | DateLikeDateRelativeTemplate
相对时间模板类型。
type DateRelativeTemplate = [
number, // 时间差阈值(毫秒)
string, // 时间差在阈值内的描述模板
string // 时间差超过阈值的描述模板
]DateRelativeTemplates
相对时间模板数组类型。
type DateRelativeTemplates = DateRelativeTemplate[]TimezoneDateOptions
时区日期配置选项。
type TimezoneDateOptions = {
date?: DateValue
utcOffset?: number
}EWeekStart
enum EWeekStart {
sunday = 0,
monday = 1,
tuesday = 2,
wednesday = 3,
thursday = 4,
friday = 5,
saturday = 6
}常量
| 常量 | 值 | 描述 |
|---|---|---|
| DATE_SECOND_MS | 1000 | 1 秒的毫秒数 |
| DATE_MINUTE_MS | 60 * 1000 | 1 分钟的毫秒数 |
| DATE_HOUR_MS | 60 * 60 * 1000 | 1 小时的毫秒数 |
| DATE_DAY_MS | 24 * 60 * 60 * 1000 | 1 天的毫秒数 |
| DATE_MONTH_MS | 30 * 24 * 60 * 60 * 1000 | 1 月的毫秒数(约) |
| DATE_YEAR_MS | 365 * 24 * 60 * 60 * 1000 | 1 年的毫秒数(约) |
函数
isValidDate
判断是否为有效日期。
function isValidDate(unknown: unknown): unknown is Date | TimezoneDate参数
| 参数 | 类型 | 描述 |
|---|---|---|
| unknown | unknown | 要检查的值 |
返回值
unknown is Date | TimezoneDate - 是否为有效日期
示例
isValidDate(new Date()) // true
isValidDate(new Date('invalid')) // false
isValidDate('2024-01-01') // false
isValidDate(1704067200000) // falsedateParse
解析日期值。
function dateParse(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值,可以是时间戳、日期字符串或 Date 对象 |
返回值
DateLike - 解析后的日期对象
示例
dateParse(1704067200000) // Date 对象
dateParse('2024-01-01') // Date 对象
dateParse('2024-01-01T12:00:00Z') // Date 对象
dateParse(new Date()) // Date 对象dateFormat
格式化日期。
function dateFormat(dateValue: DateValue, format?: string): string参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| dateValue | DateValue | - | 日期值 |
| format | string | 'YYYY-MM-DD HH:mm:ss' | 格式化模板 |
格式化占位符
| 占位符 | 描述 | 示例 |
|---|---|---|
| YYYY | 年份(4 位) | 2024 |
| YY | 年份(2 位) | 24 |
| MM | 月份(2 位) | 01-12 |
| M | 月份 | 1-12 |
| DD | 日期(2 位) | 01-31 |
| D | 日期 | 1-31 |
| HH | 小时(24 小时制,2 位) | 00-23 |
| H | 小时(24 小时制) | 0-23 |
| hh | 小时(12 小时制,2 位) | 01-12 |
| h | 小时(12 小时制) | 1-12 |
| mm | 分钟(2 位) | 00-59 |
| m | 分钟 | 0-59 |
| ss | 秒(2 位) | 00-59 |
| s | 秒 | 0-59 |
| SSS | 毫秒(3 位) | 000-999 |
| A | AM/PM | AM, PM |
| a | am/pm | am, pm |
返回值
string - 格式化后的日期字符串
示例
dateFormat(1704067200000) // '2024-01-01 08:00:00'
dateFormat('2024-01-01', 'YYYY/MM/DD') // '2024/01/01'
dateFormat(new Date(), 'YYYY年MM月DD日') // '2024年01月01日'
dateFormat(new Date(), 'HH:mm:ss') // '12:00:00'
dateFormat(new Date(), 'hh:mm:ss A') // '12:00:00 PM'dateRelative
获取相对时间描述。
function dateRelative(dateValue: DateValue, refDateValue?: DateValue, templates?: DateRelativeTemplates): string参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 目标日期 |
| refDateValue | DateValue | 参考日期,默认为当前时间 |
| templates | DateRelativeTemplates | 自定义模板 |
返回值
string - 相对时间描述
示例
const now = new Date()
const past = new Date(now.getTime() - 60 * 1000) // 1 分钟前
dateRelative(past) // '刚刚'
dateRelative(past, now) // '刚刚'
const future = new Date(now.getTime() + 60 * 60 * 1000) // 1 小时后
dateRelative(future) // '1 小时后'isLeapYear
判断是否为闰年。
function isLeapYear(year: number): boolean参数
| 参数 | 类型 | 描述 |
|---|---|---|
| year | number | 年份 |
返回值
boolean - 是否为闰年
示例
isLeapYear(2024) // true
isLeapYear(2023) // false
isLeapYear(2000) // true
isLeapYear(1900) // falseisSameDateInYear
判断两个日期是否在同一年。
function isSameDateInYear(date1: DateValue, date2: DateValue): boolean参数
| 参数 | 类型 | 描述 |
|---|---|---|
| date1 | DateValue | 第一个日期 |
| date2 | DateValue | 第二个日期 |
返回值
boolean - 是否在同一年
示例
isSameDateInYear('2024-01-01', '2024-12-31') // true
isSameDateInYear('2024-01-01', '2025-01-01') // falseisSameDateInMonth
判断两个日期是否在同一个月。
function isSameDateInMonth(date1: DateValue, date2: DateValue): boolean参数
| 参数 | 类型 | 描述 |
|---|---|---|
| date1 | DateValue | 第一个日期 |
| date2 | DateValue | 第二个日期 |
返回值
boolean - 是否在同一个月
示例
isSameDateInMonth('2024-01-15', '2024-01-31') // true
isSameDateInMonth('2024-01-15', '2024-02-01') // falseisSameDateInDay
判断两个日期是否在同一天。
function isSameDateInDay(date1: DateValue, date2: DateValue): boolean参数
| 参数 | 类型 | 描述 |
|---|---|---|
| date1 | DateValue | 第一个日期 |
| date2 | DateValue | 第二个日期 |
返回值
boolean - 是否在同一天
示例
isSameDateInDay('2024-01-01 08:00', '2024-01-01 20:00') // true
isSameDateInDay('2024-01-01', '2024-01-02') // falseisSameDateInHour
判断两个日期是否在同一小时。
function isSameDateInHour(date1: DateValue, date2: DateValue): boolean参数
| 参数 | 类型 | 描述 |
|---|---|---|
| date1 | DateValue | 第一个日期 |
| date2 | DateValue | 第二个日期 |
返回值
boolean - 是否在同一小时
示例
isSameDateInHour('2024-01-01 08:30', '2024-01-01 08:45') // true
isSameDateInHour('2024-01-01 08:00', '2024-01-01 09:00') // falseisSameDateInMinute
判断两个日期是否在同一分钟。
function isSameDateInMinute(date1: DateValue, date2: DateValue): boolean参数
| 参数 | 类型 | 描述 |
|---|---|---|
| date1 | DateValue | 第一个日期 |
| date2 | DateValue | 第二个日期 |
返回值
boolean - 是否在同一分钟
示例
isSameDateInMinute('2024-01-01 08:30:15', '2024-01-01 08:30:45') // true
isSameDateInMinute('2024-01-01 08:30:00', '2024-01-01 08:31:00') // falseisSameDateInSecond
判断两个日期是否在同一秒。
function isSameDateInSecond(date1: DateValue, date2: DateValue): boolean参数
| 参数 | 类型 | 描述 |
|---|---|---|
| date1 | DateValue | 第一个日期 |
| date2 | DateValue | 第二个日期 |
返回值
boolean - 是否在同一秒
示例
isSameDateInSecond('2024-01-01 08:30:15.100', '2024-01-01 08:30:15.900') // true
isSameDateInSecond('2024-01-01 08:30:15', '2024-01-01 08:30:16') // falsedateDaysInMonth
获取指定月份的天数。
function dateDaysInMonth(dateValue: DateValue): number参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
number - 天数
示例
dateDaysInMonth('2024-01') // 31
dateDaysInMonth('2024-02') // 29
dateDaysInMonth('2023-02') // 28dateDaysInYear
获取指定年份的天数。
function dateDaysInYear(dateValue: DateValue): number参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
number - 天数
示例
dateDaysInYear('2024') // 366
dateDaysInYear('2023') // 365weeksOfYear
获取指定日期在当年的周数。
function weeksOfYear(dateValue: DateValue, weekStart?: EWeekStart): number参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| dateValue | DateValue | - | 日期值 |
| weekStart | EWeekStart | EWeekStart.sunday | 一周的开始日 |
返回值
number - 周数
示例
weeksOfYear('2024-01-01') // 1
weeksOfYear('2024-01-01', EWeekStart.monday) // 1weeksOfMonth
获取指定日期在当月的周数。
function weeksOfMonth(dateValue: DateValue, weekStart?: EWeekStart): number参数
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| dateValue | DateValue | - | 日期值 |
| weekStart | EWeekStart | EWeekStart.sunday | 一周的开始日 |
返回值
number - 周数
示例
weeksOfMonth('2024-01-01') // 1
weeksOfMonth('2024-01-08') // 2dateStartInSecond
返回秒级起始时间。
function dateStartInSecond(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 秒级起始时间,毫秒部分为 0
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateStartInSecond(date) // 2023-06-15 12:30:45.000dateStartInMinute
返回分钟级起始时间。
function dateStartInMinute(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 分钟级起始时间,秒和毫秒部分为 0
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateStartInMinute(date) // 2023-06-15 12:30:00.000dateStartInHour
返回小时级起始时间。
function dateStartInHour(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 小时级起始时间,分钟、秒和毫秒部分为 0
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateStartInHour(date) // 2023-06-15 12:00:00.000dateStartInDay
返回天级起始时间。
function dateStartInDay(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 天级起始时间,小时、分钟、秒和毫秒部分为 0
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateStartInDay(date) // 2023-06-15 00:00:00.000dateStartInWeek
返回周级起始时间(周一 00:00:00.000)。
function dateStartInWeek(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 当周周一的起始时间,时间部分为 0
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500) // 周四
dateStartInWeek(date) // 2023-06-12 00:00:00.000(周一)dateStartInMonth
返回月级起始时间。
function dateStartInMonth(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 月级起始时间,日期为当月第一天,时间部分为 0
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateStartInMonth(date) // 2023-06-01 00:00:00.000dateStartInYear
返回年级起始时间。
function dateStartInYear(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 年级起始时间,月份为 1 月,日期为 1 日,时间部分为 0
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateStartInYear(date) // 2023-01-01 00:00:00.000dateEndInSecond
返回秒级结束时间。
function dateEndInSecond(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 秒级结束时间,毫秒部分为 999
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateEndInSecond(date) // 2023-06-15 12:30:45.999dateEndInMinute
返回分钟级结束时间。
function dateEndInMinute(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 分钟级结束时间,秒为 59,毫秒为 999
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateEndInMinute(date) // 2023-06-15 12:30:59.999dateEndInHour
返回小时级结束时间。
function dateEndInHour(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 小时级结束时间,分钟为 59,秒为 59,毫秒为 999
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateEndInHour(date) // 2023-06-15 12:59:59.999dateEndInDay
返回天级结束时间。
function dateEndInDay(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 天级结束时间,小时为 23,分钟为 59,秒为 59,毫秒为 999
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateEndInDay(date) // 2023-06-15 23:59:59.999dateEndInWeek
返回周级结束时间(周日 23:59:59.999)。
function dateEndInWeek(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 当周周日的结束时间,时间为 23:59:59.999
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500) // 周四
dateEndInWeek(date) // 2023-06-18 23:59:59.999(周日)dateEndInMonth
返回月级结束时间。
function dateEndInMonth(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 月级结束时间,日期为当月最后一天,时间为 23:59:59.999
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateEndInMonth(date) // 2023-06-30 23:59:59.999dateEndInYear
返回年级结束时间。
function dateEndInYear(dateValue: DateValue): DateLike参数
| 参数 | 类型 | 描述 |
|---|---|---|
| dateValue | DateValue | 日期值 |
返回值
DateLike - 年级结束时间,月份为 12 月,日期为 31 日,时间为 23:59:59.999
示例
const date = new Date(2023, 5, 15, 12, 30, 45, 500)
dateEndInYear(date) // 2023-12-31 23:59:59.999TimezoneDate
时区日期类,用于处理不同时区的日期。
class TimezoneDate {
constructor(date?: DateValue, utcOffset?: number)
// 获取方法
getTimezoneOffset(): number
getUTCOffset(): number
getFullYear(): number
getMonth(): number
getDate(): number
getHours(): number
getMinutes(): number
getSeconds(): number
getMilliseconds(): number
// 设置方法
setFullYear(year: number, month?: number, date?: number): number
setMonth(month: number, date?: number): number
setDate(date: number): number
setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number): number
setMinutes(minutes: number, seconds?: number, milliseconds?: number): number
setSeconds(seconds: number, milliseconds?: number): number
setMilliseconds(milliseconds: number): number
// 转换方法
toISOString(): string
// 静态方法
static changeUtcOffset(td: TimezoneDate, utcOffset: number): TimezoneDate
static getTimezoneOffset(utcOffset?: number): number
static getUTCOffset(timezoneOffset?: number): number
}示例
// 创建时区日期
const td = new TimezoneDate('2024-01-01', 8) // UTC+8
// 获取时间
td.getFullYear() // 2024
td.getMonth() // 0
td.getDate() // 1
// 修改时区
const td2 = TimezoneDate.changeUtcOffset(td, -5) // UTC-5
td2.getHours() // 与 UTC+8 相差 13 小时
// 转换为 ISO 字符串
td.toISOString() // '2024-01-01T00:00:00.000+08:00'