moment太重? 那就试试miment--一个超轻量级的js时间库
介绍
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
<script src='你js存放的目录/miment-min.js'> </script>
<script>
miment().format() // 2018-04-09 23:01:58 这是我写这篇文档的时候,运行代码显示的时间
</script>
如果你是在单页面应用或者nodejs环境下使用,首先你需要使用安装一下Miment
npm i miment
或者
yarn add miment
然后就可以在你的项目中使用了
import miment from 'miment'
miment().format()
API
你也可以猛戳这里看example
API 分为3大类
第一类是返回其他对象的,比如format,返回的是字符串 json返回的是一个josn
第二类是返回miment对象的,你可以在调完一个api后面继续调用另一个api,也就是我们所说的链式调用
第三类是从Date对象继承的,也就是说Date对象有的方法,miment也同样有,该类方法建议尽量少用
第一类
format
格式化时间 ,format方法也就是我们平时最常用的一个了,他一共接收2个参数,这2个参数都有默认值,不传就使用默认值参数名称 参数类型 参数默认值 是否必传 说明 格式化的字符串 string 'YYYY-MM-DD hh:mm:ss' N 年YYYY,月MM,日DD,时hh,分mm,秒ss,毫秒SSS,数字星期ww,中文星期WW 是否是格式化一个时间差 boolean false N 比如你要计算的时间是一个倒计时,这个时候也就需要传true 本着简单的原则,这里格式化方式没有做的太灵活,有时候灵活也是一种学习成本,因为你需要记很多的用法,不是吗?,
注意格式化字符串区分大小写,记的技巧是大的单位大写 YYYY MM DD,小的单位小写 hh mm ss 毫秒跟星期特殊的单独记,
参数必须严格按照说明里面的填写,多一个或者少一个都认不到,比如YYYY写成YYY或者YY这样是识别不了的第二个参数的用法可以参考 distance函数
示例
miment().format('YYYY年MM月DD日 hh:mm:ss') // 2018-04-09 23:49:36
miment().format('YYYY/MM/DD hh-mm-ss SSS') // 2018/04/09 23-49-36 568
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搞定,
这就是我们追求的极简,当然,也会有一丢丢的性能损失,不过个人觉得对于当今的硬件设备,你完全可以忽略这一点点性能。除非你的项目很特殊。json
输出json格式的时间,不需要参数直接上代码
miment().json()
看输出
{
"year": 2018,
"month": 4,
"date": 11,
"hour": 8,
"minute": 57,
"second": 41,
"day": 3,
"milliSecond": 87
}
输出内容比较简单,应该很好理解,这里就不对输出做介绍了,day返回的是星期几,从0-星期天 1-星期一,以此类推
stamp
输出时间戳,不需要参数miment().stamp()
看输出
1523408529932
会输出一串代表当前时间的数字,这个对前端基本没啥用,不过有时候后端的同学会要求传这个
daysInMonth
获取当前月的天数,不需要参数miment().daysInMonth() // 30
第二类
add
增加或减少时间,它接收2个参数参数名称 参数类型 参数默认值 是否必传 说明 增量 number 0 N 要增加的时间量,增加传正数,减少传负数 增量单位 string 无默认值 Y 要增加的时间单位,可选有YYYY MM DD hh mm ss SSS ww WW 单位 的可选参数跟格式化方法
format
的类似,这么做也是为了方便记忆,只需要记一套方案同样地 单位也区分大小写,记的技巧是大的单位大写 YYYY MM DD,小的单位小写 hh mm ss 毫秒跟星期特殊的单独记,
参数必须严格按照说明里面的填写,多一个或者少一个都认不到,比如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-12 09:29:55
需要注意的是,当你调完
第一类
的方法以后,返回的就不是miment对象了,比如format
返回的是一个字符串,这个时候你就不能再调用miment上的方法了,
会报错Uncaught TypeError: miment(...).format(...).xxx is not a function
因为字符串的原型上面没有这个方法miment().add(1,'DD').format().add(1,'DD') // 报错
distance
计算2个时间的距离 接收2个参数,返回一个miment对象参数名称 参数类型 参数默认值 是否必传 说明 起始时间 miment/date/number/string 无 Y 接受4种类型参数,会自动转换 结束时间 miment/date/number/string 无 N 同上 只传一个起始时间的时候,返回 起始时间 - miment当前时间
起始时间和结束时间都有传的时候,返回 起始时间 - 结束时间
miment().distance('2018-04-10 00:00:00') // Mon Dec 29 1969 22:11:51 GMT+0800 (CST)
miment().distance(1523408529932) // Wed Dec 31 1969 07:13:47 GMT+0800 (CST) miment().distance('2018-04-10 00:00:00', new Date()) //Mon Dec 29 1969 22:11:13 GMT+0800 (CST)
miment().distance('2018-04-10 00:00:00', '2018-04-11 00:00:00') //Mon Dec 29 1969 22:10:46 GMT+0800 (CST)
你一定注意到了,distance方法返回的时间,竟然都是1969年的? 这实际上是基于1970-01-01 00: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秒
firstDayOfWeek
获取 本周的第一天(周日) 不需要参数miment().firstDayOfWeek() // Sun Apr 08 2018 11:27:55 GMT+0800 (CST)
miment().firstDayOfWeek().format() // 2018-04-08 11:27:55
如果想获取周一呢?周二、三、四、五、六呢?
miment().firstDayOfWeek().add(1,'DD').format() // 2018-04-09 11:27:55
firstDay
获取每个月的第一天 不需要参数miment().firstDay() // Sun Apr 01 2018 00:00:00 GMT+0800 (CST)
miment().firstDay().format() // 2018-04-01 00:00:00
lastDay
获取每个月的最后一天 不需要参数miment().lastDay() // Mon Apr 30 2018 00:00:00 GMT+0800 (CST)
miment().lastDay().format() // 2018-04-30 00:00:00
第三类
Date自带方法
miment继承自Date对象,所以也拥有Date对象的所有方法,这里就不做深入讲解,需要更多关于Date对象的说明,
请移步至MDN查看
> 不过需要注意的是,由于继承而来的方法是属于Date对象的,为了保持一致,我们没有去对方法做改动,所以方法无法返回miment对象,也就是说无法链式调用miment
写在最后
目前这些功能(函数),是我们团队在日常实践中碰到的比较常用的,如果你对功能有新的需求或者建议,
欢迎给我们提Issue,如果喜欢miment,
请在我的github上给我一个star,你的star就是我最大的动力了,谢谢!
moment太重? 那就试试miment--一个超轻量级的js时间库的更多相关文章
- 腾讯出品的一个超棒的 Android UI 库
腾讯出品的一个超棒的 Android UI 库 相信做 Android 久了大家都会有种体会,那就是 Android 开发相对于前端开发来说统一的 UI 开源库比较少.造成这种现象的原因一方面是大多数 ...
- 大数据开发,Hadoop Spark太重?你试试esProc SPL
摘要:由于目标和现实的错位,对很多用户来讲,Hadoop成了一个在技术.应用和成本上都很沉重的产品. 本文分享自华为云社区<Hadoop Spark太重,esProc SPL很轻>,作者: ...
- ELK太重?试试KFC日志采集
写在前面 ELK三剑客(ElasticSearch,Logstash,Kibana)基本上可以满足日志采集.信息处理.统计分析.可视化报表等一些日志分析的工作,但是对我们来说--太重了,并且技术栈不是 ...
- Abp太重了?轻量化Abp框架
本文首发于个人博客(https://blog.zhangchi.fun/) 在进行框架的选型时,经常会听到"***框架太重了"之类的声音,比如"Abp太重了,不适合我们. ...
- 当IIS挂的网站出现选 图片文件, 静态文件都打不开时, 可以试试新建一个应用程序池试试看...
当IIS挂的网站出现选 图片文件, 静态文件都打不开时, 可以试试新建一个应用程序池试试看...
- 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个
376. Wiggle Subsequence 自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干 ...
- 介绍一个开源的SIP(VOIP)协议库PJSIP
本文系转载,出处不可考. 假设你对SIP/VoIP技术感兴趣,哪希望你不要错过:),假设你对写出堪称优美的Code感兴趣 ,那么你也不可错过:) 这期间我想分析一下一个实际的协议栈的设计到实现的相关技 ...
- 搭建一个超好用的 cmdb 系统
10 分钟为你搭建一个超好用的 cmdb 系统 CMDB 是什么,作为 IT 工程师的你想必已经听说过了,或者已经烂熟了,容我再介绍一下,以防有读者还不知道.CMDB 的全称是 Configurati ...
- 一个非常棒的Go-Json解析库
json是一种数据格式,经常被用作数据交换,页面展示,序列化等场景,基本每种语言都有对应的json解析框架,Go语言也不例外,并且内置了json库,基本能够满足一些普通开发场景,但有些复杂场景下就不太 ...
随机推荐
- python,winreg,获取当前系统的桌面绝对路径
import winreg import os def main(): new_path = os.path.join(desktop_path(), 'aaa.xlsx') # 结果为:C:\\Us ...
- 41)PHP,数据库函数的注意点
(1)那个mysqli_connect() 函数返回的是一个数据库连接对象,所以,你要是var_dump()这个函数的返回值,就是一个对象 (2)那个mysqli_query() ...
- 如何使用jQuery给asp.net的TextBox取值和赋值
解决办法: 可以在控件中先设置属性ClientInstandName的值和ID的值一样,再使用$("#ID").val("12345")
- Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionExcep linux下mysql修改连接超时wait_timeout修改后就ok了
Linux下mysql修改连接超时wait_timeout 1,首先: show variables like '%timeout%': 显示结果: +------------------------ ...
- ddt-python测试数据驱动工具(转载)
背景 python 的unittest 没有自带数据驱动功能. 所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成. DDT是 “Data-Driven Tests”的缩写 ...
- [LC] 298. Binary Tree Longest Consecutive Sequence
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
- 吴裕雄--天生自然python学习笔记:python用OpenCV 读取和显示图形
Open CV 是一个开源.跨平台的计算机视觉库,它可 以在商业和研究领域中免费使用,目前已广泛应用于人机 互动.人脸识别.动作识别.运动跟踪等领域. 要识别特定的图像,最重要的是要有识别对象的特征 ...
- python语法基础-函数-递归函数-长期维护
############### 递归 ############## # 递归的定义——在一个函数里再调用这个函数本身 # 递归的最大深度——998 # 二分查找算法 # 你观察这个列表,这是 ...
- discussion|局限性|解释|猜测|前作与同行
讨论是整篇论文的精华和灵魂,考查作者的文献积累量和对所研究内容的理解深度,作者需要阐述为什么结果是重要的,内容包括理论.应用.在其他其他领域的作用及应用,阐述时要求直接明确. 具体而言,首先概述最重要 ...
- 求求你,下次面试别再问我什么是 Spring AOP 和代理了!
https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9403056301388627935% ...