V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
探索世界的好奇心万岁
iamkun
V2EX  ›  分享发现

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

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

    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
       2018-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   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   3653 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 318ms · UTC 03:00 · PVG 11:00 · LAX 19:00 · JFK 22:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.