Moment.js 是一个大而全的 JS 时间库,很大地方便了我们处理日期和时间。但是 Moment.js 太重了(200k+ with locals),可能一般项目也只使用到了她几个常用的 API。虽然社区也有几个轻量的时间库,要想迁移过去又会增加新的学习和迁移成本。
如果能有一个和 Moment.js 一样语法,一样功能,又轻量的库该多好!
Day.js 是一个轻量的 JavaScript 时间日期处理库,和 Moment.js 的 API 设计保持完全一样. 如果你曾经用过 Moment.js, 那么你已经知道如何使用 Day.js
Day.js 基本用法如下,相同的 API,相同的链式操作。
dayjs().startOf('month').add(1, 'day').set('year', 2018).format('YYYY-MM-DD HH:mm:ss');
Day.js 虽然仅有 2kb 大小,但功能上也包含了时间处理的全部常用方法。
喜欢可以给个💖star💖鼓励一下吗 https://github.com/xx45/dayjs
如果您的项目里没有其他国家语言本地化的需求,那想缩小打包体积,提升开发体验只需要 replace(/moment/g, 'dayjs') 全局替换一下。就能从 Moment.js + locals 200kb 减小成 dayjs 2kb 的体积。所有的 API 调用都保持不变,无需修改。
来感受一下 Dayjs 的语法吧,是不是很看起来亲切呢 😋 (没错 这就是 moment 的语法嘛)
dayjs() // 当前时间
dayjs('1995-12-25') // 1995-12-25
dayjs(Date.now() - 24 * 60 * 60 * 1000) // 昨天
dayjs().format('YYYY 年 MM 月 DD 日 HH:mm:ss') // 2018 年 08 月 08 日 00:00:00
dayjs().format('[YYYY]') // "[2018]"。[] 里的会原样输出。
dayjs().add(7, 'days') // 之后的第 7 天
dayjs().subtract(1, 'months') // 上个月
dayjs().startOf('months') // 获取一月初 
dayjs().endOf('year') // 获取一年年末
dayjs('2010-10-20').isBefore('2010-10-21') // 早于
dayjs('2010-10-20').isAfter('2010-10-19') // 晚于
dayjs().isLeapYear() // 闰年
欢迎来 issue 和 pr 哦 https://github.com/xx45/dayjs
|  |      1zazzaz      2018-04-27 13:55:43 +08:00 我在今天 github trending 排行榜看到大佬的项目了 4000star 很厉害呀 喜欢这种小而美的库 | 
|  |      2iamkun OP 小而美 我喜欢这个说法 😄 | 
|  |      3sunjourney      2018-04-27 14:51:52 +08:00 你是 immutable 的,moment 是 mutable 的,replace(/moment/g, 'dayjs') ,怕是要出篓子哦。 | 
|  |      4sunjourney      2018-04-27 14:53:59 +08:00 其实如果不能通过 moment 的 test cases,`replace(/moment/g, 'dayjs') ` 就最好不要这样介绍,免得有人出 bug 了怪库 | 
|  |      5iamkun OP 恩 @sunjourney 你说的对 ,下次会更严谨一点。用 moment 时为了避免 bug 一般会 clone 出来一个再操作(假装 mutable),所以我也对应实现了一个 clone 的 API | 
|  |      6wxsm      2018-04-27 14:59:48 +08:00 支持一下 | 
|  |      7airyland      2018-04-27 15:00:05 +08:00 赞,但是越多人使用就越可能提出更多的需求和问题,希望能尽量保持体积。 | 
|  |      8sunjourney      2018-04-27 15:07:00 +08:00 @iamkun #5 主要鬼知道有没有人在利用 mutable 编程。。。 | 
|      9kohos      2018-04-27 15:53:13 +08:00 支持,momentjs 确实太大了点,以后开发换 dayjs 了 | 
|  |      10zazzaz      2018-04-27 16:51:53 +08:00 @sunjourney 写 moment 必须要每一步都调用 clone 呀 不然很有可能出现各种莫名其妙的 bug | 
|  |      12airyland      2018-04-27 18:00:41 +08:00  1 @iamkun #11 因为是组件库,都是按需加载,新需求一般也不会让单个组件体积膨胀,所以其实没有这个问题。。工具库像 lodash 是可以按需加载单个函数的,或许你可以保持核心小,其他扩展作为附加文件额外加载,因为大多数时候用户只是需要核心库。 | 
|  |      15FEDT      2018-04-27 22:41:31 +08:00 via iPhone 赞 | 
|  |      17iamkun OP @yuanfnadi 谢谢反馈 ,github 看到你的 issue 了,预计明天发的版本会解决。如果比较急可以传入之前先`replace(/-/g, '/')` 即可 | 
|  |      18airyland      2018-04-27 23:55:06 +08:00 @zazzaz #14 一开始上 Github Trending 还挺兴奋的,但是过了 5k 后就没感觉了,再过了 10k 后就会感觉增长缓慢所以不会再去关注 star 数了,实际上维护也挺花精力的。 | 
|  |      19SourceMan      2018-04-27 23:55:55 +08:00 via iPhone 已经用 date-fns 了。。 | 
|  |      20phoenixlzx      2018-04-30 14:23:22 +08:00 | 
|  |      21iamkun OP @phoenixlzx 哇 TJ 大神吗? 赶快去看看 | 
|  |      22zazzaz      2018-05-01 20:56:58 +08:00 @phoenixlzx 火前留名 tj star 的项目 过一万星星估计已经不远了 | 
|  |      23zj9495      2018-05-09 12:02:47 +08:00 不能处理 unix 时间么 https://s1.ax1x.com/2018/05/09/CdOtpT.png | 
|  |      26WildCat      2018-05-11 23:57:52 +08:00 楼主在 Brighton ? | 
|      27asahui      2018-06-19 23:36:32 +08:00 via iPhone 能介绍一下如何做到比 moment 小这么多吗,精简了哪些地方 |