now.js 0.1.0 发布了
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版的就显得很容易。很快我就写完了除了Parse
和MustParse
之外的所有方法。跟原库对比一下。觉得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
使用,以后可能会支持单独使用。
对比
- moment是大而全,now.js是刚够用。
- moment的parse相当强大,now.js就暂时不支持了,只支持和
new Date(args)
相同的args
参数类型。不过format
应该都基本上和moment的一样,不过测试用例现在还没有写太全,如果谁用了并且发现bug,可以到github去提issues。不胜感激。 - moment是页面一加载的时候会把所有的i18n都初始化了,这点我个人认为不好,加载时间长,网络情况不好的时候,差不多需要10秒我才能在devtool上调试(当然这也包括官网加载的其他很多东西)。now.js只加载默认的,需要的时候按需加载。
- moment做什么操作前都要检测一下date是否合法的(isvalid)。now.js在parse的时候如果不合法就直接抛出错误,以免后续没玩没了的检测。当然这可能损失了用户友好性,但是对减少代码量是很有帮助的。
结语
这个库不是我一个人写的,是许多开源工作者共同完成的。感谢moment的所有开源贡献者,我从中学习了很多东西。后续还会继续研究moment的代码细节,偷偷它的思想。
写代码什么最重要?思想最重要!
now.js 0.1.0 发布了相关推荐
- Node.js 11.12.0 发布,服务器端的 JavaScript 运行环境
Node.js 11.12.0 发布了.Node.js 是一个基于 Chrome V8 引擎的 JavaScript runtime,使用高效.轻量级的事件驱动.非阻塞 I/O 模型. 新版本更新亮点 ...
- When.js 1.8.0 发布,Promises/A 的实现
When.js 1.8.0 发布了. When.js 是 cujojs 的轻量级的 Promises/A 和 when() 实现,从 wire.js 的异步核心和 cujojs 的 IOC 容器派生而 ...
- 腾讯回应 QQ 被工信部通报;由微软老兵领导,Facebook 开发新操作系统;Node.js 13.4.0 发布 | 极客头条...
整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...
- 华为否认今年将推出搭载鸿蒙系统手机;苹果或在 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条...
快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...
- 百度网盘将推出单次会员服务;苹果回应否认操纵搜索结果;Node.js 12.7.0 发布 | 极客头条...
快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...
- Node.js 11.14.0 发布,服务器端的 JavaScript 运行环境
Node.js 11.14.0 发布了.Node.js 是一个基于 Chrome V8 引擎的 JavaScript runtime,使用高效.轻量级的事件驱动.非阻塞 I/O 模型. 新版本更新亮点 ...
- 10月14日科技资讯|华为折叠屏手机月底或开卖;苹果计划 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条
「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...
- 极客日报:王者荣耀道歉:因新游海报擅用原神素材;Facebook改名为Meta;Node.js v16.13.0发布
一分钟速览新闻点! 北汽极狐华为HI版新车将于11月交付 王者荣耀回应IP新游海报擅用原神素材 微博新增"炸毁评论"功能 卢伟冰:小米之家门店将突破1万家 Q3季度中国智能手机市场 ...
- iPhone 14/Pro卫星紧急求救上线;非法采集用户位置,谷歌赔偿3.9亿美元;Node.js 19.1.0发布|极客头条
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
- Ext JS 3.2.0发布(转)
(说明:该文转自javaeye) 不少令人振奋的新功能 1.form里面的复合组件 ---写过extjs的人都知道,form+column layout是一件多么让人郁闷的事... http://ww ...
最新文章
- PCL特征点与配准(1)
- python模块学下urllib
- bzoj 5090 组题
- 实验一线性表的基本操作实现及其应用(JavaScript实现)
- ubuntu实现简单的划词工具
- 2018 CodeM复赛:C. 边的染色
- 软件开发工具大题考点整理
- idea打包 jar文件
- [ubuntu][原创]ubuntu18.04安装rabbitvcs正确方法
- LDR6028充电OTG直播线直播声卡音频转接器最具性价比方案
- 魔兽争霸 java_魔兽争霸3Java问题
- 【Python 爬虫系列非专业教学】(3)手把手教你获取猫眼电影 Top 100 榜单
- g_mass_storage: Unknown symbol fsg_common_set_sysfs (err 0)
- 使用python将excel单元格中指定文字加粗标红
- socket函数接口
- blender关于怎么导出上完色的FBX格式模型、以及导出后再导入,材质预览和渲染模式下材质透明度混乱的解决办法。
- tansig、logsig公式与导数推导
- 云计算概念入门和知识普及(转)
- java 拼音转汉字_用Java转化汉字为拼音全拼
- rust前哨站_rust - diesel 1 的安装与使用 (连接数据库,读取)