Skip to content

day.js简介

Day.js是一个极简的JavaScript库,可以为现代浏览器解析、验证、操作和显示日期和时间。可以运行在浏览器和 Node.js 中。

  • 文件大小只有2KB左右,下载、解析和执行的JavaScript更少,为代码留下更多的时间。代替moment.js
  • 所有更改Day.js对象的API操作都将返回一个新的实例。这有助于防止错误和避免长时间的调试会话。
  • Day.js对国际化有很大的支持。但是,除非您使用它们,否则它们都不会包含在您的构建中。

参考:https://dayjs.fenxianglu.cn/

js
dayjs().format(); // 2020-09-08T13:42:32+08:00
dayjs().format('YYYY-MM-DD');  // 2020-09-08
dayjs().format('YYYY-MM-DD HH:mm:ss'); // 2020-09-08 13:47:12
// 2011-10-17 00:17:56
dayjs(1318781876406).format('YYYY-MM-DD HH:mm:ss');

解析

js
let now = dayjs() //等同于 dayjs(new Date()) 的调用
dayjs('2018-04-04T16:00:00.000Z')

//如果知道输入字符串的格式,您可以用它来解析日期
// 此功能依赖 CustomParseFormat 插件
dayjs.extend(customParseFormat)
dayjs("12-25-1995", "MM-DD-YYYY")

//解析包含本地化语言的日期字符串,可以传入第三个参数。
require('dayjs/locale/zh-cn')
dayjs('2018 三月 15', 'YYYY MMMM DD', 'zh-cn')

//最后一个参数可传入布尔值来启用严格解析模式。 
//严格解析要求格式和输入内容完全匹配,包括分隔符。
// isValid 返回 布尔值 表示 Dayjs 的日期是否通过校验。
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);

// 使用原生 Javascript Date 对象创建一个 Day.js 对象。
var day = dayjs(new Date(2018, 8, 18))

//可以传入包含单位和数值的一个对象来创建 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

//默认情况下,Day.js 会把时间解析成本地时间。依赖 UTC 插件
//如果想使用 UTC 时间,您可以调用 dayjs.utc() 而不是 dayjs()。
dayjs.extend(utc)
dayjs().format() //2019-03-06T08:00:00+08:00
dayjs.utc().format() // 2019-03-06T00:00:00Z
// 此外,在 UTC 模式下, 所有 getters 和 setters 将使用 Date#getUTC* 和 Date#setUTC* 方法而不是 Date#get* 和 Date#set* 方法。
dayjs.utc().seconds(30).valueOf()// => new Date().setUTCSeconds(30)
dayjs.utc().seconds()// => new Date().getUTCSeconds()

//所有的 Day.js 对象都是不可变的。 但如果有必要,使用 dayjs#clone 可以复制出一个当前对象。
var a = dayjs()
var b = a.clone()
// a 和 b 是两个独立的 Day.js 对象

取值/赋值

在设计上 Day.js 的 getter 和 setter 使用了相同的 API,也就是说,不传参数调用方法即为 getter,调用并传入参数为 setter。

这些 API 调用了对应原生 Date 对象的方法。

js
dayjs().second(30).valueOf() // => new Date().setSeconds(30)
dayjs().second() // => new Date().getSeconds()

dayjs.utc().seconds(30).valueOf()// => new Date().setUTCSeconds(30)
dayjs.utc().seconds()// => new Date().getUTCSeconds()

dayjs().get(unit) === dayjs()[unit]()
dayjs().get('second') === dayjs().second()

dayjs().set(unit, value) === dayjs()[unit](value)
dayjs().set('second', 30) === dayjs().second(30)

// 返回传入的 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')])

操作

js
//add:增加 subtract:减去 startOf:设置到一个时间的开始 endOf:结束
dayjs('2019-01-25').add(1, 'day').subtract(1, 'year').startOf('year').endOf('month').toString()

//返回一个在当前时区模式下的 Day.js 对象。
// utc(true) 传入 true 将只改变 UTC 模式而不改变本地时间。
dayjs.extend(utc)
var a = dayjs.utc()
a.format() // 2019-03-06T00:00:00Z
a.local().format() //2019-03-06T08:00:00+08:00

显示

js
dayjs().format() 
// 默认返回的是 ISO8601 格式字符串 '2020-04-02T08:02:17-05:00'

dayjs('2019-01-25').format('[YYYYescape] YYYY-MM-DDTHH:mm:ssZ[Z]') 
// 'YYYYescape 2019-01-25T00:00:00-02:00Z'

dayjs('2019-01-25').format('DD/MM/YYYY') // '25/01/2019'

//返回指定单位下两个日期时间之间的差异。默认毫秒,
// month:以月为单位。true:得到浮点数,而不是默认的整数
const date1 = dayjs('2019-01-25')
date1.diff('2018-06-05', 'month', true) // 7.645161290322581

//获取当前月份包含的天数。
dayjs('2019-01-25').daysInMonth() // 31

//获取原生的 Date 对象
dayjs('2019-01-25').toDate()

// 包含各个时间信息的 Array 。
dayjs.extend(toArray)
dayjs('2019-01-25').toArray() // [ 2019, 0, 25, 0, 0, 0, 0 ]

//序列化为 ISO 8601 格式的字符串
dayjs('2019-01-25').toJSON() // '2019-01-25T02:00:00.000Z'

// 返回包含时间信息的 Object。
dayjs.extend(toObject)
dayjs('2019-01-25').toObject()
/* { years: 2019,
     months: 0,
     date: 25,
     hours: 0,
     minutes: 0,
     seconds: 0,
     milliseconds: 0 } */

// 返回包含时间信息的 string 。
dayjs('2019-01-25').toString() // 'Fri, 25 Jan 2019 02:00:00 GMT'

查询

js
dayjs().isBefore(dayjs('2011-01-01')) // 默认毫秒
dayjs().isBefore('2011-01-01', 'year')

dayjs().isAfter(dayjs('2011-01-01')) // 默认毫秒
dayjs().isAfter('2011-01-01', 'year')

dayjs().isSame(dayjs('2011-01-01')) // 默认毫秒
dayjs().isSame('2011-01-01', 'year')

dayjs.extend(isSameOrBefore)
dayjs().isSameOrBefore(dayjs('2011-01-01')) // 默认毫秒
dayjs().isSameOrBefore('2011-01-01', 'year')


dayjs.extend(isSameOrAfter)
dayjs().isSameOrAfter(dayjs('2011-01-01')) // 默认毫秒
dayjs().isSameOrAfter('2011-01-01', 'year')

dayjs.extend(isBetween)
dayjs('2010-10-20').isBetween('2010-10-19', dayjs('2010-10-25')) 
// 默认毫秒
dayjs().isBetween('2010-10-19', '2010-10-25', 'year')
// 第四个参数是设置包容性。 [ 表示包含。 ( 表示排除。
dayjs('2016-10-30').isBetween('2016-01-01', '2016-10-30', null, '[)')

dayjs.isDayjs(dayjs()) // true
dayjs.isDayjs(new Date()) // false

国际化

js
require('dayjs/locale/de')
// import 'dayjs/locale/de' // ES 2015 

dayjs.locale('de') // 全局改变
dayjs().locale('de').format() // 只改变当前实例

dayjs.locale() // 'de'

根据 MIT 许可证发布