now.js是什么

now.js是一个javascript的时间操作小工具,类似date-fns和moment。

长啥样

简单的把示例放这,更多用法请到github去发现。

import Now from 'now.js'; // for node(browser do not need this)now = new Now() // "2017-11-20 22:23:00.285"now.beginningOfMinute()   // "2017-11-20 22:23:00"
now.beginningOfHour()     // "2017-11-20 22:00:00"
now.beginningOfDay()      // "2017-11-20 00:00:00"
now.beginningOfWeek()     // "2017-11-19 00:00:00"
now.firstDayMonday = true // Set Monday as first day, default is Sunday
now.beginningOfWeek()     // "2017-11-20 00:00:00"
now.beginningOfMonth()    // "2017-11-01 00:00:00"
now.beginningOfQuarter()  // "2017-10-01 00:00:00"
now.beginningOfYear()     // "2017-01-01 00:00:00"now.endOfMinute()         // "2017-11-20 22:23:59.999"
now.endOfHour()           // "2017-11-20 22:59:59.999"
now.endOfDay()            // "2017-11-20 23:59:59.999"
now.endOfWeek()           // "2017-11-25 23:59:59.999"
now.firstDayMonday = true // Set Monday as first day, default is Sunday
now.endOfWeek()           // "2017-11-26 23:59:59.999"
now.endOfMonth()          // "2017-11-30 23:59:59.999"
now.endOfQuarter()        // "2017-12-31 23:59:59.999"
now.endOfYear()           // "2017-12-31 23:59:59.999"All the above functions return String type. You can pass 'self' to return Now instance:var beginningOfMinute = now.beginningOfMinute('self') // return Now instance
beginningOfMinute.format('ddd, Ah') // "Mon, PM10"
beginningOfMinute.format('LLLL') // "Monday, November 20, 2017 10:23 PM"
beginningOfMinute.isMonday() // true复制代码

为什么要写这个库

因为学习underscore源码的过程中,感觉无聊。想写个库调剂一下,当做学习的机会。

我是照着underscore源码一个个commit敲的.代码放在这里,刚看了一眼,有668次commit,两个月,敲到了1.4.3版本,可能还没到一半。

敲久了有点无聊。想动手写一个库作为调剂。碰巧之前做防健忘短信提醒的时候是用go写的后台,用了gorm,在作者jinzhu的github主页上发现了now,是一个go的时间帮助库,觉得很有意思。clone之,学之。

偷了now的思想。造一个javascript版的就显得很容易。很快我就写完了除了ParseMustParse之外的所有方法。跟原库对比一下。觉得now.js就是个玩具。这不怪我,javascript对时间处理的支持远不如go。比如go原生支持format、字符串解析成时间以及Duration等等。

想着加上format。该怎么去写?立马就想到的方法是平时经常写的根据不同条件做字符串拼接。确实是个方法。但得多少switch case才能涵盖所有情况,想想都可怕。显然这是最蠢也是工作量最大的方法。

不会,那就借鉴别人的。github上发现了date-fns和moment,支持i18n国际化。

date-fns:

import { formatRelative } from 'date-fns'
import { es, ru } from 'date-fns/esm/locale'formatRelative(subDays(new Date(), 3), new Date(), { locale: es })
//=> "el viernes pasado a las 19:26"formatRelative(subDays(new Date(), 3), new Date(), { locale: ru })
//=> "в прошлую пятницу в 19:26"复制代码

moment:

moment.locale('fr');
moment(1316116057189).fromNow(); // il y a une heure
moment.locale('en');
moment(1316116057189).fromNow(); // an hour ago复制代码

我的审美告诉我应该选择moment,调用一次locale(),这之后的format都是基于该locale的。当然它也还支持每次单独指定locale的:

moment.duration(1, "minutes").locale("en").humanize(); // a minute
moment.duration(1, "minutes").locale("fr").humanize(); // une minute
moment.duration(1, "minutes").locale("es").humanize(); // un minuto复制代码

进一步学习发现moment的format和i18n国际化高度耦合。要用它的i18n意味着基本上也得用它的format。当然i18n也不是核心的moment库作者写的,他们也精通不了那么多国家的语言,那都是github上许许多多人贡献的。开源就有这好处。看下LICENCE是MIT的,代码可用,抄。

now.js也是MIT协议的,负罪感少了点(其实MIT协议是相当宽松的,就算你拿它代码去商业化也是没有问题的)。况且我写库的主要目的是为了学习。

开干!虽说是抄,毕竟代码要整合到我的库,直接复制粘贴是不行的。所有的代码细节未必都需要全知道,但看懂整体运行的逻辑是必须的,下点功夫,整合成功,开源。

思维脑图

moment:

当然,moment的东西不止上图这些,我只取了一部分来画。

now.js:

now.js的Duration和moment的不一样,现在还不支持单独使用,只是给内部方法elapse使用,以后可能会支持单独使用。

对比

  1. moment是大而全,now.js是刚够用。
  2. moment的parse相当强大,now.js就暂时不支持了,只支持和new Date(args)相同的args参数类型。不过format应该都基本上和moment的一样,不过测试用例现在还没有写太全,如果谁用了并且发现bug,可以到github去提issues。不胜感激。
  3. moment是页面一加载的时候会把所有的i18n都初始化了,这点我个人认为不好,加载时间长,网络情况不好的时候,差不多需要10秒我才能在devtool上调试(当然这也包括官网加载的其他很多东西)。now.js只加载默认的,需要的时候按需加载。
  4. moment做什么操作前都要检测一下date是否合法的(isvalid)。now.js在parse的时候如果不合法就直接抛出错误,以免后续没玩没了的检测。当然这可能损失了用户友好性,但是对减少代码量是很有帮助的。

结语

这个库不是我一个人写的,是许多开源工作者共同完成的。感谢moment的所有开源贡献者,我从中学习了很多东西。后续还会继续研究moment的代码细节,偷偷它的思想。

写代码什么最重要?思想最重要!

now.js 0.1.0 发布了相关推荐

  1. Node.js 11.12.0 发布,服务器端的 JavaScript 运行环境

    Node.js 11.12.0 发布了.Node.js 是一个基于 Chrome V8 引擎的 JavaScript runtime,使用高效.轻量级的事件驱动.非阻塞 I/O 模型. 新版本更新亮点 ...

  2. When.js 1.8.0 发布,Promises/A 的实现

    When.js 1.8.0 发布了. When.js 是 cujojs 的轻量级的 Promises/A 和 when() 实现,从 wire.js 的异步核心和 cujojs 的 IOC 容器派生而 ...

  3. 腾讯回应 QQ 被工信部通报;由微软老兵领导,Facebook 开发新操作系统;Node.js 13.4.0 发布 | 极客头条...

    整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...

  4. 华为否认今年将推出搭载鸿蒙系统手机;苹果或在 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  5. 百度网盘将推出单次会员服务;苹果回应否认操纵搜索结果;Node.js 12.7.0 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  6. Node.js 11.14.0 发布,服务器端的 JavaScript 运行环境

    Node.js 11.14.0 发布了.Node.js 是一个基于 Chrome V8 引擎的 JavaScript runtime,使用高效.轻量级的事件驱动.非阻塞 I/O 模型. 新版本更新亮点 ...

  7. 10月14日科技资讯|华为折叠屏手机月底或开卖;苹果计划 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...

  8. 极客日报:王者荣耀道歉:因新游海报擅用原神素材;Facebook改名为Meta;Node.js v16.13.0发布

    一分钟速览新闻点! 北汽极狐华为HI版新车将于11月交付 王者荣耀回应IP新游海报擅用原神素材 微博新增"炸毁评论"功能 卢伟冰:小米之家门店将突破1万家 Q3季度中国智能手机市场 ...

  9. iPhone 14/Pro卫星紧急求救上线;非法采集用户位置,谷歌赔偿3.9亿美元;Node.js 19.1.0发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  10. Ext JS 3.2.0发布(转)

    (说明:该文转自javaeye) 不少令人振奋的新功能 1.form里面的复合组件 ---写过extjs的人都知道,form+column layout是一件多么让人郁闷的事... http://ww ...

最新文章

  1. PCL特征点与配准(1)
  2. python模块学下urllib
  3. bzoj 5090 组题
  4. 实验一线性表的基本操作实现及其应用(JavaScript实现)
  5. ubuntu实现简单的划词工具
  6. 2018 CodeM复赛:C. 边的染色
  7. 软件开发工具大题考点整理
  8. idea打包 jar文件
  9. [ubuntu][原创]ubuntu18.04安装rabbitvcs正确方法
  10. LDR6028充电OTG直播线直播声卡音频转接器最具性价比方案
  11. 魔兽争霸 java_魔兽争霸3Java问题
  12. 【Python 爬虫系列非专业教学】(3)手把手教你获取猫眼电影 Top 100 榜单
  13. g_mass_storage: Unknown symbol fsg_common_set_sysfs (err 0)
  14. 使用python将excel单元格中指定文字加粗标红
  15. socket函数接口
  16. blender关于怎么导出上完色的FBX格式模型、以及导出后再导入,材质预览和渲染模式下材质透明度混乱的解决办法。
  17. tansig、logsig公式与导数推导
  18. 云计算概念入门和知识普及(转)
  19. java 拼音转汉字_用Java转化汉字为拼音全拼
  20. rust前哨站_rust - diesel 1 的安装与使用 (连接数据库,读取)

热门文章

  1. 配置mac百度云同步盘
  2. MSSQL数据库管理---索引
  3. 顶点计划 挑战性课程讨论
  4. 牛客多校第九场H Cutting Bamboos(主席树 区间比k小的个数)题解
  5. Numpy学习笔记(三)
  6. 朱光潜:要有悲剧,才能算人生
  7. 20154322 杨钦涵 Exp2 后门原理与实践
  8. 百度编辑器复制微信图片无法保存
  9. silverlight 中缓存应用程序相应的库文件
  10. HDU 3200 Arborescence Counting