https://github.com/iamkun/dayjs
简易
不可变的
国际化
轻量级
兼容性
要在您的 Node.js 项目中使用 Day.js,只需使用 NPM 安装即可。
npm install dayjs然后在项目代码中引入即可:
const dayjs = require("dayjs")
//import dayjs from 'dayjs' // ES 2015
dayjs().format()<script src="path/to/dayjs/dayjs.min.js"></script>
<script>
dayjs().format()
</script>Day.js 同步更新在这些 CDN 上 cdnjs.com, unpkg 和 jsDelivr
<!-- CDN example (jsDelivr) -->
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<script>
dayjs().format()
</script>在 NPM 包中已经包含 Day.js 的 TypeScript 类型定义文件
npm install dayjs在 TypeScript 项目中导入并使用
import * as dayjs from 'dayjs'
dayjs().format()如果您的 tsconfig.json 包含以下配置,您必须使用 import dayjs from 'dayjs' 的 default import 模式:
{
//tsconfig.json
"compilerOptions": {
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
}
}如果您没有上述配置,default import 将无法正常工作。 您需要使用 import * as dayjs from 'dayjs'
在使用本地化语言和插件,您首先需要导入它们
import * as dayjs from "dayjs"
import * as isLeapYear from "dayjs/plugin/isLeapYear" // 导入插件
import "dayjs/locale/zh-cn" // 导入本地化语言
dayjs.extend(isLeapYear) // 使用插件
dayjs.locale("zh-cn") // 使用本地化语言Day.js 并没有对原生 Date.prototype 做任何修改, 而是给 Date 对象做了一层封装。 使用支持的数据格式调用 dayjs() 即可取到这个封装的对象。
Day.js 对象是不可变的,所有的 API 操作都将返回一个全新的实例
直接调用 dayjs() 将返回一个包含当前日期和时间的 Day.js 对象

var now = dayjs()
// 等同于 dayjs(new Date()) 的调用解析传入的 ISO 8601 格式的字符串并返回一个 Day.js 对象实例
为了保证结果一致,当解析除了 ISO 8601 格式以外的字符串时,您应该使用 String + Format

dayjs("2018-04-04T16:00:00.000Z")
dayjs("2018-04-13 19:18:17.040+02:00")
dayjs("2018-04-13 19:18")如果知道输入字符串的格式,您可以用它来解析日期。
依赖 CustomParseFormat插件,才能正常运行
dayjs.extend(customParseFormat)
dayjs("12-25-1995", "MM-DD-YYYY")如果想解析包含本地化语言的日期字符串,可以传入第三个参数
require("dayjs/locale/zh-cn")
dayjs("2018 三月 15", "YYYY MMMM DD", "zh-cn")最后一个参数可传入布尔值来启用严格解析模式。 严格解析要求格式和输入内容完全匹配,包括分隔符
dayjs("1970-00-00", "YYYY-MM-DD").isValid() // true
dayjs("1970-00-00", "YYYY-MM-DD", true).isValid() // false
dayjs("1970-00-00", "YYYY-MM-DD", "es", true).isValid() // false如果您不知道输入字符串的确切格式,但知道它可能是几种中的一种,可以使用数组传入多个格式
dayjs("12-25-2001", ["YYYY", "YYYY-MM-DD"], "es", true)| 输入 | 例子 | 详情 |
|---|---|---|
| YY | 01 | 两位数的年份 |
| YYYY | 2001 | 四位数的年份 |
| M | 1-12 | 月份,从 1 开始 |
| MM | 01-12 | 月份,两位数 |
| MMM | Jan-Dec | 缩写的月份名称 |
| MMMM | January-December | 完整的月份名称 |
| D | 1-31 | 月份里的一天 |
| DD | 01-31 | 月份里的一天,两位数 |
| H | 0-23 | 小时 |
| HH | 00-23 | 小时,两位数 |
| h | 1-12 | 小时, 12 小时制 |
| hh | 01-12 | 小时, 12 小时制, 两位数 |
| m | 0-59 | 分钟 |
| mm | 00-59 | 分钟,两位数 |
| s | 0-59 | 秒 |
| ss | 00-59 | 秒 两位数 |
| S | 0-9 | 毫秒,一位数 |
| SS | 00-99 | 毫秒,两位数 |
| SSS | 000-999 | 毫秒,三位数 |
| Z | -05:00 | UTC 的偏移量 |
| ZZ | -0500 | UTC 的偏移量,两位数 |
| A | AM PM | 上午 下午 大写 |
| a | am pm | 上午 下午 小写 |
| Do | 1st... 31st | 带序数词的月份里的一天 |
| X | 1410715640.579 | Unix 时间戳 |
| x | 1410715640579 | Unix 时间戳 |
| title | parameters | dayjs | moment |
|---|---|---|---|
| invalid date with overflow | ('35/22/2010 99:88:77', 'DD-MM-YYYY HH:mm:ss') | '08-11-2011 04:29:17' | 'Invalid date' |
| invalid date with overflow, strict | ('35/22/2010 99:88:77', 'DD-MM-YYYY HH:mm:ss', true) | 'Invalid Date' | 'Invalid date' |
| '0' day or month (using default values) | ('1970-00-00', 'YYYY-MM-DD') | '1970-01-01' | 'Invalid date' |
| '0' day or month (using default values), strict | ('1970-00-00', 'YYYY-MM-DD', true) | 'Invalid Date' | 'Invalid date' |
| date not matching format | ('10/12/2014', 'YYYY-MM-DD') | '01-01-2014' | '12-20-2010' |
| date not matching format, strict | ('10/12/2014', 'YYYY-MM-DD', true) | 'Invalid Date' | 'Invalid date' |
| first match vs. longest match | ('2012-05-28 10:21:15', ['YYYY', 'YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss']) | '2012-01-01 00:00:00' | '2012-05-28 10:21:15' |
| first match vs. longest match, strict | ('2012-05-28 10:21:15', ['YYYY', 'YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss'], true) | '2012-05-28 10:21:15' | '2012-05-28 10:21:15' |
解析传入的一个 Unix 时间戳 (13 位数字,从 1970 年 1 月 1 日 UTC 午夜开始所经过的毫秒数) 创建一个 Day.js 对象
传入的参数必须是 number
dayjs(1318781876406)解析传入的一个 Unix 时间戳 (10 位数字,从 1970 年 1 月 1 日 Utc 午夜开始所经过的秒数) 创建一个 Day.js 对象
dayjs.unix(1318781876)这个方法是用 dayjs( timestamp * 1000) 实现的,所以传入时间戳里的小数点后面的秒也会被解析
使用原生 Javascript Date 对象创建一个 Day.js 对象
这将克隆 Date 对象。 对传入的 Date 对象做进一步更改不会影响 Day.js 对象,反之亦然
var d = new Date(2018, 8, 18)
var day = dayjs(d)您可以传入包含单位和数值的一个对象来创建 Dayjs 对象。
这依赖 ObjectSupport 插件,才能正常运行
dayjs.extend(objectSupport)
dayjs({ hour: 15, minute: 10 })
dayjs.utc({ y: 2010, M: 3, d: 5, h: 15, m: 10, s: 3, ms: 123 })
dayjs({ year: 2010, month: 3, day: 5, hour: 15, minute: 10, second: 3, millisecond: 123 })
dayjs({ years: 2010, months: 3, date: 5, hours: 15, minutes: 10, seconds: 3, milliseconds: 123 })您可以传入一个数组来创建一个 Dayjs 对象,数组和结构和 new Date() 十分类似。
这依赖 ArraySupport插件,才能正常运行
dayjs.extend(arraySupport)
dayjs([2010, 1, 14, 15, 25, 50, 125]) // February 14th, 3:25:50.125 PM
dayjs.utc([2010, 1, 14, 15, 25, 50, 125])
dayjs([2010]) // January 1st
dayjs([2010, 6]) // July 1st
dayjs([2010, 6, 10]) // July 10th这依赖 UTC插件,才能正常运行
dayjs.extend(utc)
// 默认是当地时间
dayjs().format() //2019-03-06T08:00:00+08:00
// UTC 时间
dayjs.utc().format() // 2019-03-06T00:00:00Zdayjs#clone 可以复制出一个当前对象var a = dayjs()
var b = a.clone()
// a 和 b 是两个独立的 Day.js 对象
var a = dayjs()
var b = dayjs(a)返回 布尔值 表示 Dayjs 的日期是否通过校验。
这依赖 CustomParseFormat插件,才能正常运行
dayjs("2022-01-33").isValid()
// true, parsed to 2022-02-02
dayjs("some invalid string").isValid()
// false
dayjs("2022-02-31", "YYYY-MM-DD", true).isValid()
// falsedayjs().second(30).valueOf() // => new Date().setSeconds(30)
dayjs().second() // => new Date().getSeconds()如果您处于 UTC 模式,将会调用对应的 UTC 方法
dayjs.utc().second(30).valueOf() // => new Date().setUTCSeconds(30)
dayjs.utc().second() // => new Date().getUTCSeconds()// gets current millisecond
dayjs().millisecond() // 372
dayjs().millisecond(1) // 返回一个 day.js对象dayjs().second() // gets current second
dayjs().second(1) // returns new dayjs objectdayjs().minute() // gets current minute
dayjs().minute(59) // returns new dayjs object获取或设置小时。
传入 0 到 23 的数字。 如果超出这个范围,它会进位到天数。
dayjs().hour() // gets current hour
newDate = dayjs().hour(12) // returns new dayjs objectdayjs().date() // gets day of current month
dayjs().date(1) // returns new dayjs objectdayjs#date 是该月的日期。 dayjs#day 是星期几。
dayjs().day() // gets day of current week
dayjs().day(0) // returns new dayjs object根据本地化配置获取或设置星期几。
这依赖 Weekday插件,才能正常运行
如果本地化配置了星期天为一周的第一天, dayjs().weekday(0) 将返回星期天。 如果星期一是一周的第一天, dayjs().weekday(0) 将返回星期一。
dayjs.extend(weekday)
// 当星期天是一周的第一天
dayjs().weekday(-7) // last Sunday
dayjs().weekday(7) // next Sunday
// 当星期一是一周的第一天
dayjs().weekday(-7) // last Monday
dayjs().weekday(7) // next Monday
// 当星期天是一周的第一天
dayjs().weekday(-5) // last Tuesday (5th day before Sunday)
dayjs().weekday(5) // next Friday (5th day after Sunday)获取或设置 ISO 星期几 ,其中 1 是星期一、7 是星期日
这依赖 IsoWeek插件,才能正常运行
dayjs.extend(isoWeek)
dayjs().isoWeekday() // gets the current ISO day of the week
dayjs().isoWeekday(1) // Monday这依赖 DayOfYear插件,才能正常运行
dayjs.extend(dayOfYear)
dayjs("2010-01-01").dayOfYear() // 1
dayjs("2010-01-01").dayOfYear(365) // 2010-12-31获取或设置该年的第几周
这依赖 WeekOfYear插件,才能正常运行
dayjs.extend(weekOfYear)
dayjs("2018-06-27").week() // 26
dayjs("2018-06-27").week(5) // returns new dayjs object获取或设置年份的 ISO 星期。
这依赖 IsoWeek插件,才能正常运行
dayjs.extend(isoWeek)
dayjs().isoWeek() // gets the current ISO week of the year
newDate = dayjs().isoWeek(2) // returns new dayjs object月份是从 0 开始计算的,即 1 月是 0
dayjs().month() // gets current month
dayjs().month(0) // returns new dayjs object获取或设置季度
这依赖 QuarterOfYear插件,才能正常运行
dayjs.extend(quarterOfYear)
dayjs("2010-04-01").quarter() // 2
dayjs("2010-04-01").quarter(2) // returns new dayjs object获取或设置年份
dayjs().year() // gets current year
dayjs().year(2000) // returns new dayjs object获取基于当前语言配置的按周计算的年份
这依赖 WeekYear插件,才能正常运行
dayjs.extend(weekYear)
dayjs.extend(weekOfYear)
dayjs().weekYear()获取 ISO 周年
这依赖 IsoWeek插件,才能正常运行
dayjs.extend(isoWeek)
dayjs().isoWeekYear()获取当前年份的周数,根据 ISO weeks的定义
这依赖 IsoWeeksInYear插件,才能正常运行
dayjs.extend(isoWeeksInYear)
dayjs.extend(isLeapYear)
dayjs("2004-01-01").isoWeeksInYear() // 53
dayjs("2005-01-01").isoWeeksInYear() // 52从 Day.js 对象中获取相应信息的 getter
dayjs().get(unit) === dayjs()[unit]()各个传入的单位对大小写不敏感,支持缩写和复数。 请注意,缩写是区分大小写的
dayjs().get("year")
dayjs().get("month") // start 0
dayjs().get("date")
dayjs().get("hour")
dayjs().get("minute")
dayjs().get("second")
dayjs().get("millisecond")| 单位 | 缩写 | 详情 |
|---|---|---|
| date | D | 月份里的日期 |
| day | d | 星期几 (星期天 0,星期六 6) |
| month | M | 月份 (一月 0, 十二月 11) |
| year | y | 年份 |
| hour | h | 小时 |
| minute | m | 分钟 |
| second | s | 秒 |
| millisecond | ms | 毫秒 |
通用的 setter,两个参数分别是要更新的单位和数值,调用后会返回一个修改后的新实例。
dayjs().set(unit, value) === dayjs()[unit](value)
dayjs().set(unit, value) === dayjs()[unit](value)
dayjs().set("date", 1)
dayjs().set("month", 3) // 四月
dayjs().set("second", 30)也支持这样的链式调用
dayjs().set("hour", 5).set("minute", 55).set("second", 15)各个传入的单位对大小写不敏感,支持缩写和复数
返回传入的 Day.js 实例中的最大的 (即最靠近未来的)。 它接受传入多个 Day.js 实例或一个数组
这依赖 MinMax插件,才能正常运行
dayjs.extend(minMax)
dayjs.max(dayjs(), dayjs("2018-01-01"), dayjs("2019-01-01"))
dayjs.max([dayjs(), dayjs("2018-01-01"), dayjs("2019-01-01")])返回传入的 Day.js 实例中的最小的 (即最靠近过去的)。 它接受传入多个 Day.js 实例或一个数组。
这依赖 MinMax插件,才能正常运行
dayjs.extend(minMax)
dayjs.min(dayjs(), dayjs("2018-01-01"), dayjs("2019-01-01"))
dayjs.min([dayjs(), dayjs("2018-01-01"), dayjs("2019-01-01")])返回指定格式的字符串
dayjs().format() // 默认格式: '2020-04-02T08:02:17-05:00'
dayjs().format("YYYY-MM-DD HH:mm:ss") // '2020-04-02 08:02:17'| 占位符 | 输出 | 详情 |
|---|---|---|
| YY | 18 | 两位数的年份 |
| YYYY | 2018 | 四位数的年份 |
| M | 1-12 | 月份,从 1 开始 |
| MM | 01-12 | 月份,两位数 |
| MMM | Jan-Dec | 缩写的月份名称 |
| MMMM | January-December | 完整的月份名称 |
| D | 1-31 | 月份里的一天 |
| DD | 01-31 | 月份里的一天,两位数 |
| H | 0-23 | 小时 |
| HH | 00-23 | 小时,两位数 |
| h | 1-12 | 小时, 12 小时制 |
| hh | 01-12 | 小时, 12 小时制, 两位数 |
| m | 0-59 | 分钟 |
| mm | 00-59 | 分钟,两位数 |
| s | 0-59 | 秒 |
| ss | 00-59 | 秒,两位数 |
| SSS | 000-999 | 毫秒,三位数 |
| Z | -05:00 | UTC 的偏移量 |
| ZZ | -0500 | UTC 的偏移量,两位数 |
| A | AM PM | 上午 下午 大写 |
| a | am pm | 上午 下午 小写 |
| Do | 1st... 31st | 带序数词的月份里的一天 |
| X | 1410715640.579 | Unix 时间戳(秒) |
| x | 1410715640579 | Unix 时间戳(毫秒) |
这依赖 AdvancedFormat插件,才能正常运行
dayjs.extend(advancedFormat)
dayjs().format("Q Do k kk X x")| 占位符 | 输出 | 详情 |
|---|---|---|
| Q | 1-4 | 季度 |
| Do | 1st... 31st | 带序数词的月份里的一天 |
| kk | 01-24 | 小时,2 位数 |
| k | 1-24 | 小时 |
| X | 1360013296 | Unix 时间戳(秒) |
| x | 1360013296123 | Unix 时间戳(毫秒) |
增加时间并返回一个新的 Day.js 对象
dayjs().add(7, "day") // 增加七天
dayjs().add(7, "month") // 增加七个月
dayjs().add(7, "year") // 增加七年| 单位 | 缩写 | 详情 |
|---|---|---|
| date | D | 月份里的日期 |
| day | d | 星期几 (星期天 0,星期六 6) |
| month | M | 月份 (一月 0, 十二月 11) |
| year | y | 年份 |
| hour | h | 小时 |
| minute | m | 分钟 |
| second | s | 秒 |
| millisecond | ms | 毫秒 |
减少时间并返回一个新的 Day.js 对象
dayjs().subtract(7, "year") // 减少七年返回一个当前时间单位的开始的 Day.js 对象
dayjs().startOf("year") // 今年一月1日 00:00:00
dayjs().startOf("month") // 本月1日 00:00:00
dayjs().startOf("week") // 本周的第一天 00:00:00
dayjs().startOf("day") // 今天 00:00:00
dayjs().startOf("hour") // 当前小时 00:00:00返回一个当前时间单位的结束的 Day.js 对象
dayjs().endOf("month") // 本月最后一天 23:59:59返回一个布尔值,表示一个 Day.js 对象是否在另一个 Day.js 对象之前
dayjs("2010-10-20").isBefore(dayjs("2010-10-21")) // true返回一个布尔值,表示一个 Day.js 对象是否和另一个 Day.js 对象相同
dayjs("2010-10-20").isSame(dayjs("2010-10-20")) // true返回一个布尔值,表示一个 Day.js 对象是否在另一个 Day.js 对象之后
dayjs("2010-10-20").isAfter(dayjs("2010-10-19")) // true返回一个布尔值,表示一个 Day.js 对象是否在或早于另一个 Day.js 对象
这依赖 IsSameOrBefore插件,才能正常运行
dayjs("2010-10-20").isSameOrBefore(dayjs("2010-10-21")) // true
dayjs("2010-10-20").isSameOrBefore(dayjs("2010-10-20")) // true返回一个布尔值,表示一个 Day.js 对象是否在或晚于另一个 Day.js 对象
这依赖 IsSameOrAfter插件,才能正常运行
dayjs("2010-10-20").isSameOrAfter(dayjs("2010-10-19")) // true
dayjs("2010-10-20").isSameOrAfter(dayjs("2010-10-20")) // true返回一个布尔值,表示一个 Day.js 对象是否在两个 Day.js 对象之间
这依赖 IsBetween插件,才能正常运行
dayjs("2010-10-20").isBetween(dayjs("2010-10-19"), dayjs("2010-10-25")) // true获取是否是闰年
这依赖 IsLeapYear插件,才能正常运行
dayjs.extend(isLeapYear)
dayjs("2000-01-01").isLeapYear() // true获取是否是某一天
这依赖 IsSameOrBefore和IsSameOrAfter插件,才能正常运行
dayjs.extend(isSameOrBefore)
dayjs.extend(isSameOrAfter)
dayjs("2010-10-20").isSameOrBefore("2010-10-21", "year") // true
dayjs("2010-10-20").isSameOrAfter("2010-10-19", "year") // trueDay.js 的核心功能很小,但可以通过插件扩展功能。以下是一些常用插件:
import customParseFormat from "dayjs/plugin/customParseFormat"
dayjs.extend(customParseFormat)
dayjs("12-25-1995", "MM-DD-YYYY")import relativeTime from "dayjs/plugin/relativeTime"
dayjs.extend(relativeTime)
dayjs("1999-01-01").fromNow() // 24 years agoimport utc from "dayjs/plugin/utc"
dayjs.extend(utc)
dayjs.utc().format()import timezone from "dayjs/plugin/timezone"
import utc from "dayjs/plugin/utc"
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.tz("2019-01-01", "America/New_York")import "dayjs/locale/zh-cn" // 导入中文语言包
dayjs.locale("zh-cn") // 使用中文
dayjs().format("dddd, MMMM DD, YYYY") // 星期三, 三月 15, 2023Day.js 支持多种语言,包括但不限于:
// 计算距离目标日期的剩余时间
function countdown(targetDate) {
const now = dayjs()
const target = dayjs(targetDate)
const diff = target.diff(now)
if (diff <= 0) return "已结束"
const days = target.diff(now, "day")
const hours = target.diff(now, "hour") % 24
const minutes = target.diff(now, "minute") % 60
const seconds = target.diff(now, "second") % 60
return `${days}天 ${hours}小时 ${minutes}分钟 ${seconds}秒`
}
// 使用示例
console.log(countdown("2023-12-31 23:59:59"))// 根据时间显示不同的格式
function formatTime(date) {
const now = dayjs()
const target = dayjs(date)
const diffDays = now.diff(target, "day")
if (diffDays === 0) {
// 今天
return target.format("HH:mm")
} else if (diffDays === 1) {
// 昨天
return `昨天 ${target.format("HH:mm")}`
} else if (diffDays < 7) {
// 一周内
return target.format("dddd HH:mm")
} else {
// 超过一周
return target.format("MM-DD HH:mm")
}
}
// 使用示例
console.log(formatTime("2023-03-15 14:30:00"))// 计算工作日(排除周末)
function addWorkdays(startDate, days) {
let date = dayjs(startDate)
let remainingDays = days
while (remainingDays > 0) {
date = date.add(1, "day")
// 周末不算工作日
if (date.day() !== 0 && date.day() !== 6) {
remainingDays--
}
}
return date
}
// 使用示例
console.log(addWorkdays("2023-03-15", 5).format("YYYY-MM-DD"))// 获取常用时间范围
function getTimeRange(type) {
const now = dayjs()
switch (type) {
case "today":
return {
start: now.startOf("day"),
end: now.endOf("day")
}
case "yesterday":
return {
start: now.subtract(1, "day").startOf("day"),
end: now.subtract(1, "day").endOf("day")
}
case "thisWeek":
return {
start: now.startOf("week"),
end: now.endOf("week")
}
case "thisMonth":
return {
start: now.startOf("month"),
end: now.endOf("month")
}
case "lastMonth":
return {
start: now.subtract(1, "month").startOf("month"),
end: now.subtract(1, "month").endOf("month")
}
default:
return {
start: now.startOf("day"),
end: now.endOf("day")
}
}
}
// 使用示例
const { start, end } = getTimeRange("thisWeek")
console.log(`本周范围: ${start.format("YYYY-MM-DD")} 至 ${end.format("YYYY-MM-DD")}`)统一使用 UTC 时间存储
避免直接操作 Date 对象
合理使用插件
处理时区问题
dayjs/plugin/timezone)性能优化
A: Day.js 是 Moment.js 的轻量级替代品,主要区别:
A: 使用 timezone 插件(dayjs/plugin/timezone):
import timezone from "dayjs/plugin/timezone"
import utc from "dayjs/plugin/utc"
dayjs.extend(utc)
dayjs.extend(timezone)
// 转换为特定时区
const date = dayjs.tz("2023-03-15 12:00", "America/New_York")
// 获取当前时区
const localDate = dayjs.tz("2023-03-15 12:00", dayjs.tz.guess())A: 可以使用以下方法:
function getWorkdays(startDate, endDate) {
const start = dayjs(startDate)
const end = dayjs(endDate)
let workdays = 0
let currentDate = start
while (currentDate.isBefore(end) || currentDate.isSame(end)) {
// 周末不算工作日
if (currentDate.day() !== 0 && currentDate.day() !== 6) {
workdays++
}
currentDate = currentDate.add(1, "day")
}
return workdays
}
// 使用示例
console.log(getWorkdays("2023-03-01", "2023-03-31"))A: 使用 relativeTime 插件:
import relativeTime from "dayjs/plugin/relativeTime"
dayjs.extend(relativeTime)
dayjs("2023-03-10").fromNow() // 5 days ago
dayjs("2023-03-20").toNow() // in 5 daysA: 使用时区插件会自动处理夏令时:
import timezone from "dayjs/plugin/timezone"
import utc from "dayjs/plugin/utc"
dayjs.extend(utc)
dayjs.extend(timezone)
// 时区插件会自动处理夏令时
const date = dayjs.tz("2023-03-15 12:00", "America/New_York")