Day.js 2KB 轻量时间库 和 Moment.js 一样的 API - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iamkun
V2EX    分享发现

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

  •  4
     
  •   iamkun 2018-04-27 13:45:31 +08:00 6586 次点击
    这是一个创建于 2733 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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'); 
    • 和 Moment.js 相同的 API 和用法
    • 不可变数据 (Immutable)
    • 支持链式操作 (Chainable)
    • 仅 2kb 大小的微型库
    • 全浏览器兼容

    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

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

    iamkun
        21
    iamkun  
    OP
       2018-04-30 21:32:10 +08:00
    @phoenixlzx 哇 TJ 大神吗? 赶快去看看
    zazzaz
        22
    zazzaz  
       2018-05-01 20:56:58 +08:00
    @phoenixlzx 火前留名 tj star 的项目 过一万星星估计已经不远了
    zj9495
        23
    zj9495  
       2018-05-09 12:02:47 +08:00
    iamkun
        24
    iamkun  
    OP
       2018-05-09 13:30:36 +08:00
    @zj9495 我们正在做一套插件系统 应该这几天就上线 unix 和 utc 会已一个插件的形式支持的
    iamkun
        25
    iamkun  
    OP
       2018-05-09 13:34:07 +08:00
    @zj9495 目前可以先这么用 dayjs(unix * 1000) 传入毫秒是可以支持的
    WildCat
        26
    WildCat  
       2018-05-11 23:57:52 +08:00
    楼主在 Brighton ?
    asahui
        27
    asahui  
       2018-06-19 23:36:32 +08:00 via iPhone
    能介绍一下如何做到比 moment 小这么多吗,精简了哪些地方
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3450 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 04:38 PVG 12:38 LAX 21:38 JFK 00:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86