做为一个程序员,阅读别人优秀代码是提高本身技术能力的一个很好的方法。下面,我将本身阅读 dayjs(v1.6.10)的源码的过程记录下来。javascript
dayjs 是一个轻量的 JavaScript 时间日期处理库,其用法(api)和 Moment.js 彻底同样。java
由于其 api 和 Moment.js 彻底相同,因此你能够将以前使用 Moment.js 的项目无痛的迁移使用 dayjs。git
首先,阅读 dayjs 的源码,咱们应该从 dayjs 的 api 入手。程序员
官方 api 文档(中文) 官方 api 文档(英文)github
Day.js 没有修改原生的 Date.prototype,而是在 Date 对象基础上包装了一层,叫作 Dayjs 对象。Dayjs 对象是不可变的,即全部改变 Dayjs 的操做都会返回一个新的实例。json
其中,api 分为 6 类:segmentfault
解析api
获取和设置数组
操做浏览器
展现
查询
插件
1.当没有参数时,会返回一个新的 Dayjs 实例对象,且为当前日期和时间
dayjs()
2.当参数为 ISO 8601 标准的字符串时
dayjs('2018-07-01T12:00:00.000Z')
3.当参数为 unix 时间戳时
dayjs(1318781876406);
4.当参数为一个原生的 JavaScript Date 对象时
dayjs(new Date(2018, 7, 1));
dayjs() 构造函数会返回一个 Dayjs 实例对象
会克隆返回一个新的 Dayjs 对象,有两种方法
// 1.使用 .clone() 方法 dayjs().clone() // 2.使用 dayjs 构造函数,且传入的参数为被克隆的 Dayjs 实例对象 dayjs(dayjs('2018-7-1'))
返回一个布尔值,表示该 Dayjs 实例对象是否有效
dayjs().isValid()
// 年 dayjs().year() // 月 dayjs().month() // 日 dayjs().date() // 星期几 dayjs().day() // 时 dayjs().hour() // 分 dayjs().minute() // 秒 dayjs().second() // 毫秒 dayjs().millisecond()
上面返回的值与用原生 Date.prototype 对象下的方法获取 “年月日...” 的值是同样的,其实在源码中,就是使用的 Date 的原生方法获取的 “年月日...”
返回一个新的日期时间被改变的 Dayjs 实例对象
dayjs().set('date', 1) // 设置 “日” 为 1 日 dayjs().set('month', 3) // 设置 “月” 为 4 月 dayjs().set('second', 30) // 设置 “秒” 为 30 秒
Dayjs 实例对象可使用不少方法操做
dayjs('2018-7-1') .add(1, 'day') .substract(1, 'year').toString() // 在 2018-7-1 基础上添加 1 天,而后减小 1 年,最后转换为字符串
dayjs().add(7. 'day')
dayjs().subtract(7. 'year')
返回克隆的以传入的单位开始时间的 Dayjs 实例对象
dayjs().startOf('week') // 本周开始的时间
返回克隆的以传入的单位结束时间的 Dayjs 实例对象
dayjs().endOf('month') // 本月的结束时间
返回一个按照你规定好的格式化后的字符串
dayjs().format(); // current date in ISO6801, without fraction seconds e.g. '2020-04-02T08:02:17-05:00' dayjs('2019-01-25').format('{YYYY} MM-DDTHH:mm:ssZ[Z]'); // '{2019} 01-25T00:00:00-02:00Z' dayjs('2019-01-25').format('DD/MM/YYYY'); // '25/01/2019'
返回两个 Dayjs 实例对象的时间差
const date1 = dayjs('2019-01-25'); const date2 = dayjs('2018-06-05'); date1.diff(date2); // 20214000000 date1.diff(date2, 'months'); // 7 date1.diff(date2, 'months', true); // 7.645161290322581 date1.diff(date2, 'days'); // 233
dayjs('2019-01-25').valueOf(); // 1548381600000
dayjs('2019-01-25').unix(); // 1548381600
dayjs('2018-7-1').daysInMonth() // 31
// 1.转换为 原生 Date 对象 dayjs('2019-01-25').toDate() // 2.转换为 数组 dayjs('2019-01-25').toArray() // [ 2019, 0, 25, 0, 0, 0, 0 ] // 3.转换为 json dayjs('2019-01-25').toJSON() // '2019-01-25T02:00:00.000Z' // 4.转换为 ISO 8601 字符串 dayjs('2019-01-25').toISOString() // '2019-01-25T02:00:00.000Z' // 5.转换为 ISO 8601 字符串 dayjs('2019-01-25').toObject() /* { years: 2019, months: 0, date: 25, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 } */ // 6.转换为 字符串 dayjs('2019-01-25').toString() // 'Fri, 25 Jan 2019 02:00:00 GMT'
dayjs().isBefore(dayjs()); // false
dayjs().isSame(dayjs()); // true
dayjs().isAfter(dayjs()); // false
dayjs.isDayjs(dayjs()); // true dayjs.isDayjs(new Date()); // false
dayjs('2000-01-01').isLeapYear(); // true
使用 .from .to .fromNow .toNow 方法来得到相对时间
使用 .from .to .fromNow .toNow 方法来得到相对时间