跳至主要內容

Dayjs

俞文健大约 4 分钟

常用日期

提示

我们把 “年”,“月”,“周”,“日” 称为一个时间单位。

今天

// 今天
dayjs().format("YYYY-MM-DD") // => '2024-05-12'

// 现在
dayjs().format("YYYY-MM-DD HH:mm:ss") // => '2024-05-12 19:23:12'

// 今天的零点
dayjs().startOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-05-12 00:00:00'

// 今天的最后一秒
dayjs().endOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-05-12 23:59:59'

一个时间单位前

一天前。

// 一天前
dayjs().subtract(1, "day").format("YYYY-MM-DD") // => '2024-05-11'

// 一天前的零点
dayjs().subtract(1, "day").startOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-05-11 00:00:00'

// 一天前的最后一秒
dayjs().subtract(1, "day").endOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-05-11 23:59:59'

一周前。

// 一周前
dayjs().subtract(1, "week").format("YYYY-MM-DD") // => '2024-05-05'

// 一周前的零点
dayjs().subtract(1, "week").startOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-05-05 00:00:00'

// 一周前的最后一秒
dayjs().subtract(1, "week").endOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-05-05 23:59:59'

一月前。

// 一月前
dayjs().subtract(1, "month").format("YYYY-MM-DD") // => '2024-04-12'

// 一月前的零点
dayjs().subtract(1, "month").startOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-04-12 00:00:00'

// 一月前的最后一秒
dayjs().subtract(1, "month").endOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2024-04-12 23:59:59'

一年前。

// 一年前
dayjs().subtract(1, "year").format("YYYY-MM-DD") // => '2023-05-12'

// 一年前的零点
dayjs().subtract(1, "year").startOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2023-05-12 00:00:00'

// 一年前的最后一秒
dayjs().subtract(1, "year").endOf("day").format("YYYY-MM-DD HH:mm:ss") // => '2023-05-12 23:59:59'

一个时间单位的周期

本周。

注意

dayjs 一周的开始时间默认是周期,所以这里需要进行本地化处理。

import dayjs from "dayjs"
import weekday from "dayjs/plugin/weekday"
import "dayjs/locale/zh-cn"

dayjs.extend(weekday)
dayjs.locale("zh-cn")

// 本周的第一天
dayjs().startOf("week").format("YYYY-MM-DD") // => '2024-05-06'

// 本周的最后一天
dayjs().endOf("week").format("YYYY-MM-DD") // => '2024-05-12'

上周。

注意

dayjs 一周的开始时间默认是周期,所以这里需要进行本地化处理。

import dayjs from "dayjs"
import weekday from "dayjs/plugin/weekday"
import "dayjs/locale/zh-cn"

dayjs.extend(weekday)
dayjs.locale("zh-cn")

// 上周的第一天
dayjs().subtract(1, "week").startOf("week").format("YYYY-MM-DD") // => '2024-04-29'

// 上周的最后一天
dayjs().subtract(1, "week").endOf("week").format("YYYY-MM-DD") // => '2024-05-05'

本月。

// 本月的第一天
dayjs().startOf("month").format("YYYY-MM-DD") // => '2024-05-01'

// 本月的最后一天
dayjs().endOf("month").format("YYYY-MM-DD") // => '2024-05-31'

上个月。

// 上个月的第一天
dayjs().subtract(1, "month").startOf("month").format("YYYY-MM-DD") // => '2024-04-01'

// 上个月的最后一天
dayjs().subtract(1, "month").endOf("month").format("YYYY-MM-DD") // => '2024-04-30'

今年。

// 今年的第一天
dayjs().startOf("year").format("YYYY-MM-DD") // => '2024-01-01'

// 今年的最后一天
dayjs().endOf("year").format("YYYY-MM-DD") // => '2024-12-31'

去年。

// 去年的第一天
dayjs().subtract(1, "year").startOf("year").format("YYYY-MM-DD") // => '2023-01-01'

// 去年的最后一天
dayjs().subtract(1, "year").endOf("year").format("YYYY-MM-DD") // => '2023-12-31'

封装通用函数

unitOfTime

一个时间单位前、一个时间单位前的零点、一个时间单位前的最后一秒。

import dayjs from "dayjs"
import weekday from "dayjs/plugin/weekday"
import "dayjs/locale/zh-cn"

dayjs.extend(weekday)
dayjs.locale("zh-cn") // 本地化处理

type TimeOf = "n" | "s" | "e" // "now" "startOf" "endOf"
type UnitOf = "d" | "w" | "M" | "y" // "day" "week" "month" "year"

/**
 * 一个时间单位前
 *
 * @example 今天
 * unitOfTime() // => '2024-05-12'
 * @example 现在
 * unitOfTime(undefined, "n") // => '2024-05-12 19:23:12'
 * @example 今天的零点
 * unitOfTime(undefined, "s") // => '2024-05-12 00:00:00'
 * @example 今天的最后一秒
 * unitOfTime(undefined, "e") // => '2024-05-12 23:59:59'
 *
 * @example 昨天
 * unitOfTime("d") // => '2024-05-11'
 * @example 昨天的零点
 * unitOfTime("d", "s") // => '2024-05-11 00:00:00'
 * @example 昨天的最后一秒
 * unitOfTime("d", "e") // => '2024-05-11 23:59:59'
 */
function unitOfTime(unitOf?: UnitOf, timeOf?: TimeOf) {
  const i = unitOf ? 1 : 0
  if (timeOf === "n") return dayjs().subtract(i, unitOf).format("YYYY-MM-DD HH:mm:ss")
  if (timeOf === "s") return dayjs().subtract(i, unitOf).startOf("d").format("YYYY-MM-DD HH:mm:ss")
  if (timeOf === "e") return dayjs().subtract(i, unitOf).endOf("d").format("YYYY-MM-DD HH:mm:ss")
  return dayjs().subtract(1, unitOf).format("YYYY-MM-DD")
}

unitOfCycle

一个时间单位的周期。[上周第一天,上周最后一天]、[去年第一天,去年最后一天]。。。

import dayjs from "dayjs"
import weekday from "dayjs/plugin/weekday"
import "dayjs/locale/zh-cn"

dayjs.extend(weekday)
dayjs.locale("zh-cn") // 本地化处理

type UnitOf = "d" | "w" | "M" | "y" // "day" "week" "month" "year"

/**
 * 一个时间单位的周期
 *
 * @example 今天
 * unitOfCycle(0, "d") // => ['2024-05-12', '2024-05-12']
 * @example 昨天
 * unitOfCycle(1, "d") // => ['2024-05-11', '2024-05-11']
 * @example 本周
 * unitOfCycle(0, "w") // => ['2024-05-06', '2024-05-12']
 * @example 上周
 * unitOfCycle(1, "w") // => ['2024-04-29', '2024-05-05']
 * @example 本月
 * unitOfCycle(0, "M") // => ['2024-05-01', '2024-05-31']
 * @example 上个月
 * unitOfCycle(1, "M") // => ['2024-04-01', '2024-04-30']
 * @example 今年
 * unitOfCycle(0, "y") // => ['2024-01-01', '2024-12-31']
 * @example 去年
 * unitOfCycle(1, "y") // => ['2023-01-01', '2023-12-31']
 */
function unitOfCycle(n: number, unitOf: UnitOf) {
  return [
    dayjs().subtract(n, unitOf).startOf(unitOf).format("YYYY-MM-DD"),
    dayjs().subtract(n, unitOf).endOf(unitOf).format("YYYY-MM-DD")
  ]
}