⏰Day.js 2KB 轻量时间库 和 Moment.js 一样的 API

2018-04-27 13:45:31 +08:00
 iamkun

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 and pr's welcome

欢迎来 issue 和 pr 哦 https://github.com/xx45/dayjs

5933 次点击
所在节点    分享发现
27 条回复
zazzaz
2018-04-27 13:55:43 +08:00
我在今天 github trending 排行榜看到大佬的项目了 4000star 很厉害呀 喜欢这种小而美的库
iamkun
2018-04-27 14:27:40 +08:00
小而美 我喜欢这个说法 😄
sunjourney
2018-04-27 14:51:52 +08:00
你是 immutable 的,moment 是 mutable 的,replace(/moment/g, 'dayjs') ,怕是要出篓子哦。
sunjourney
2018-04-27 14:53:59 +08:00
其实如果不能通过 moment 的 test cases,`replace(/moment/g, 'dayjs') ` 就最好不要这样介绍,免得有人出 bug 了怪库
iamkun
2018-04-27 14:57:45 +08:00
恩 @sunjourney 你说的对 ,下次会更严谨一点。用 moment 时为了避免 bug 一般会 clone 出来一个再操作(假装 mutable),所以我也对应实现了一个 clone 的 API
wxsm
2018-04-27 14:59:48 +08:00
支持一下
airyland
2018-04-27 15:00:05 +08:00
赞,但是越多人使用就越可能提出更多的需求和问题,希望能尽量保持体积。
sunjourney
2018-04-27 15:07:00 +08:00
@iamkun #5 主要鬼知道有没有人在利用 mutable 编程。。。
kohos
2018-04-27 15:53:13 +08:00
支持,momentjs 确实太大了点,以后开发换 dayjs 了
zazzaz
2018-04-27 16:51:53 +08:00
@sunjourney 写 moment 必须要每一步都调用 clone 呀 不然很有可能出现各种莫名其妙的 bug
iamkun
2018-04-27 17:46:00 +08:00
@airyland 请问大佬在做 vux 时候有类似的经验吗 保持体积和满足需求真的是很矛盾的
airyland
2018-04-27 18:00:41 +08:00
@iamkun #11 因为是组件库,都是按需加载,新需求一般也不会让单个组件体积膨胀,所以其实没有这个问题。。工具库像 lodash 是可以按需加载单个函数的,或许你可以保持核心小,其他扩展作为附加文件额外加载,因为大多数时候用户只是需要核心库。
iamkun
2018-04-27 19:48:38 +08:00
@airyland #12 受教了
@kohos 欢迎尝试
zazzaz
2018-04-27 22:35:41 +08:00
@airyland 又一个大佬 vux 也很好用的 敢问两位大佬 这好几千的 star 是什么体验呀
FEDT
2018-04-27 22:41:31 +08:00
yuanfnadi
2018-04-27 22:57:35 +08:00
@iamkun iOS 遇到了兼容问题
同样的时间字符串 iOS 显示非法
iamkun
2018-04-27 23:35:54 +08:00
@yuanfnadi 谢谢反馈 ,github 看到你的 issue 了,预计明天发的版本会解决。如果比较急可以传入之前先`replace(/-/g, '/')` 即可
airyland
2018-04-27 23:55:06 +08:00
@zazzaz #14 一开始上 Github Trending 还挺兴奋的,但是过了 5k 后就没感觉了,再过了 10k 后就会感觉增长缓慢所以不会再去关注 star 数了,实际上维护也挺花精力的。
SourceMan
2018-04-27 23:55:55 +08:00
已经用 date-fns 了。。
phoenixlzx
2018-04-30 14:23:22 +08:00
哇楼主厉害了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/450369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX