超轻量级的js时间库miment使用解析
介绍
Miment是一个轻量级的时间库(打包压缩后只有1K),没有太多的方法,
Miment的设计理念就是让你以几乎为零的成本快速上手,无需一遍一遍的撸文档
由来
首先致敬一下Moment,非常好用的一个时间库,我本身也是Moment重度使用者,用习惯了Moment,一碰到需要处理时间的需求,立马Moment,不过有时候想想,Moment给我们提供了那么多的功能,但是我们天天用的,也就那么一两个,刚好最近在写微信小程序,然后在页面引入Moment,打包完,包竟然大了200多K,把Moment去掉,就直接少掉200多K,反复试了好几次,确定一个Moment在小程序里面,占用大概200K的空间。
于是就想自己写一个类似Moment的精简的时间库,于是就有了这个,为什么要叫Miment呢,其实刚开始我是想叫Mini-Moment的,但是考虑到以后可能会经常使用到,打2个单词中间还要加一个下划线太累了,所以就把Mini-Moment缩水成Miment了。
开始使用
如果你是直接在浏览器里面使用,请下载./dist/miment-min.js到你的项目里面去,然后在页面引入后即可直接使用miment
如果你是在单页面应用或者nodejs环境下使用,首先你需要使用安装一下Miment
npmimiment
或者
yarnaddmiment
然后就可以在你的项目中使用了
importmimentfrom'miment' miment().format()
API
你也可以猛戳这里看example
API分为3大类
- 第一类是返回其他对象的,比如format,返回的是字符串json返回的是一个josn
- 第二类是返回miment对象的,你可以在调完一个api后面继续调用另一个api,也就是我们所说的链式调用
- 第三类是从Date对象继承的,也就是说Date对象有的方法,miment也同样有,该类方法建议尽量少用
第一类
1.format格式化时间,format方法也就是我们平时最常用的一个了,他一共接收2个参数,这2个参数都有默认值,不传就使用默认值
参数名称 | 参数类型 | 参数默认值 | 是否必传 | 说明 |
---|---|---|---|---|
格式化的字符串 | string | 'YYYY-MM-DDhh:mm:ss' | N | 年YYYY,月MM,日DD,时hh,分mm,秒ss,毫秒SSS,数字星期ww,中文星期WW |
是否是格式化一个时间差 | boolean | false | N | 比如你要计算的时间是一个倒计时,这个时候也就需要传true |
本着简单的原则,这里格式化方式没有做的太灵活,有时候灵活也是一种学习成本,因为你需要记很多的用法,不是吗?,
注意格式化字符串区分大小写,记的技巧是大的单位大写YYYYMMDD,小的单位小写hhmmss毫秒跟星期特殊的单独记,
参数必须严格按照说明里面的填写,多一个或者少一个都认不到,比如YYYY写成YYY或者YY这样是识别不了的
第二个参数的用法可以参考distance函数
示例
miment().format('YYYY年MM月DD日hh:mm:ss')//2018-04-0923:49:36 miment().format('YYYY/MM/DDhh-mm-ssSSS')//2018/04/0923-49-36568 miment().format('YYYY年MM月DD日星期WW')//2018年04月09日星期一 miment().format('YYYY年MM月DD日星期ww')//2018年04月09日星期1(星期日这边会显示星期0)
扩展一下,如果我们只是想获取年份或者月份或者日,可以这样用
miment().format('YYYY')//2018 miment().format('MM')//04 miment().format('DD')//09 miment().format('hh')//23 miment().format('mm')//57 miment().format('ss')//16 miment().format('SSS')//063 miment().format('ww')//1 miment().format('WW')//一
所以,有了这个方法,其实你可以不需要去记大部分原生的方法(getFUllYear,getDate,getDay...),所有的需求一个format搞定,
这就是我们追求的极简,当然,也会有一丢丢的性能损失,不过个人觉得对于当今的硬件设备,你完全可以忽略这一点点性能。除非你的项目很特殊。
2.json输出json格式的时间,不需要参数
直接上代码
miment().json()
看输出
{ "year":2018, "month":4, "date":11, "hour":8, "minute":57, "second":41, "day":3, "milliSecond":87 }
输出内容比较简单,应该很好理解,这里就不对输出做介绍了,day返回的是星期几,从0-星期天1-星期一,以此类推
3.stamp输出时间戳,不需要参数
miment().stamp()
看输出
1523408529932
会输出一串代表当前时间的数字,这个对前端基本没啥用,不过有时候后端的同学会要求传这个
4.daysInMonth获取当前月的天数,不需要参数
miment().daysInMonth()//30
第二类
5.add增加或减少时间,它接收2个参数
参数名称 | 参数类型 | 参数默认值 | 是否必传 | 说明 |
---|---|---|---|---|
增量 | number | 0 | N | 要增加的时间量,增加传正数,减少传负数 |
增量单位 | string | 无默认值 | Y | 要增加的时间单位,可选有YYYYMMDDhhmmssSSSwwWW |
单位的可选参数跟格式化方法format的类似,这么做也是为了方便记忆,只需要记一套方案
同样地单位也区分大小写,记的技巧是大的单位大写YYYYMMDD,小的单位小写hhmmss毫秒跟星期特殊的单独记,
参数必须严格按照说明里面的填写,多一个或者少一个都认不到,比如YYYY写成YYY或者YY这样是识别不了的
miment().add(1,'DD')//增加一天 miment().add(1,'YYYY').add(2,'MM').add(-3,'DD')//增加1年2个月又减回去3天 miment().add(-1,'ww')//减去一周--即获取上周的日期 miment().add(500,SSS)//增加500毫秒
add返回的值是增加完后的miment对象,所以我们可以在它后面继续调用miment有的方法。
miment().add(1,'DD').format()//我测试的时候,打印的是2018-04-1209:29:55
需要注意的是,当你调完第一类的方法以后,返回的就不是miment对象了,比如format返回的是一个字符串,这个时候你就不能再调用miment上的方法了,
会报错UncaughtTypeError:miment(...).format(...).xxxisnotafunction因为字符串的原型上面没有这个方法
miment().add(1,'DD').format().add(1,'DD')//报错
6.distance计算2个时间的距离接收2个参数,返回一个miment对象
参数名称 | 参数类型 | 参数默认值 | 是否必传 | 说明 |
---|---|---|---|---|
起始时间 | miment/date/number/string | 无 | Y | 接受4种类型参数,会自动转换 |
结束时间 | miment/date/number/string | 无 | N | 同上 |
只传一个起始时间的时候,返回起始时间-miment当前时间
起始时间和结束时间都有传的时候,返回起始时间-结束时间
miment().distance('2018-04-1000:00:00')//MonDec29196922:11:51GMT+0800(CST) miment().distance(1523408529932)//WedDec31196907:13:47GMT+0800(CST) miment().distance('2018-04-1000:00:00',newDate())//MonDec29196922:11:13GMT+0800(CST) miment().distance('2018-04-1000:00:00','2018-04-1100:00:00')//MonDec29196922:10:46GMT+0800(CST)
你一定注意到了,distance方法返回的时间,竟然都是1969年的?这实际上是基于1970-01-0100:00:00的一个毫秒数,
具体请看百度百科-unix时间,
而我们把两个时间相减,得到的可能是一个相对来说很小的数(还有可能是负数),所以离1970很近
那我们要怎么显示我们能看得懂的时间呢?很简单用格式化时间函数format,还记得format函数的第二个参数吗?
就是专门用来格式化distance计算出来的时间差,只要把第二个参数设为true,就能把当前时间格式化成时间差
我们先来看看第二个参数不传,或者传false的时候是什么样子的
miment().distance(1523408529932).format('YYYY年MM月DD日hh时mm分ss秒')//1969年12月30日00时52分16秒 miment().distance(1523408529932).format('YYYY年MM月DD日hh时mm分ss秒',false)//1969年12月30日00时52分16秒
然后我们把第二个参数设为true
miment().distance(1523408529932).format('YYYY年MM月DD日hh时mm分ss秒',true)//00年01月03日23时08分23秒
7.firstDayOfWeek获取本周的第一天(周日)不需要参数
miment().firstDayOfWeek()//SunApr08201811:27:55GMT+0800(CST) miment().firstDayOfWeek().format()//2018-04-0811:27:55
如果想获取周一呢?周二、三、四、五、六呢?
miment().firstDayOfWeek().add(1,'DD').format()//2018-04-0911:27:55
8.firstDay获取每个月的第一天不需要参数
miment().firstDay()//SunApr01201800:00:00GMT+0800(CST) miment().firstDay().format()//2018-04-0100:00:00
9.lastDay获取每个月的最后一天不需要参数
miment().lastDay()//MonApr30201800:00:00GMT+0800(CST) miment().lastDay().format()//2018-04-3000:00:00
第三类
10.Date自带方法miment继承自Date对象,所以也拥有Date对象的所有方法,这里就不做深入讲解,需要更多关于Date对象的说明,
请移步至MDN查看
不过需要注意的是,由于继承而来的方法是属于Date对象的,为了保持一致,我们没有去对方法做改动,所以方法无法返回miment对象,也就是说无法链式调用miment
写在最后
目前这些功能(函数),是我们团队在日常实践中碰到的比较常用的,如果你对功能有新的需求或者建议,
欢迎给我们提Issue,如果喜欢miment,
请在我的github上给我一个star,你的star就是我最大的动力了,谢谢!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。