miment--一个比 moment 轻很多的时间库

Miment

介绍

Miment ("Mini Moment") 是一个轻量级的时间库,打包压缩后体积 ~1K,没有过多的方法。它的上手成本几乎为零,无需反复查阅文档。当你只需要 Moment 的若干核心能力但又不希望使你的包体积膨胀时,欢迎尝试 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 即可:

<script src="https://unpkg.com/miment/dist/miment-min.js"></script>
<script>
  miment().format(‘YYYY/MM/DD hh-mm-ss SSS‘) // 2018/04/09 23-49-36 568
</script>

在 NPM 生态中使用时,请使用包管理器安装 Miment:

npm i miment

然后就可以在你的项目中使用了:

import miment from ‘miment‘
miment().format(‘YYYY/MM/DD hh-mm-ss SSS‘) // 2018/04/09 23-49-36 568

API

API 方法可分为三类:

  • 返回 Computed 结果的方法。如 format 返回字符串,json 返回的是一个 JSON 对象。
  • 返回 Miment 对象的方法,即支持链式调用。
  • 从 Date 对象继承的方法。Date 对象上的方法 miment 也可以使用,这些方法类似私有 API,不推荐直接使用。

返回 Computed 结果的方法

format

format 方法几乎是我们平时最常用的了。它一共接收 2 个参数,这 2 个参数都有默认值,不传则使用默认值:

参数名称 参数类型 参数默认值 是否必传 说明
格式化的字符串 string ‘YYYY-MM-DD hh:mm:ss‘ N 年 YYYY
月 MM
日 DD
时 hh
分 mm
秒 ss
毫秒 SSS
数字星期 ww
中文星期 WW
是否为时间差 boolean false N 格式化 distance 时间差时,使用 true
  • 本着简单的原则,我们没有实现特别灵活的格式化方式。有时灵活也意味着学习成本:你需要记忆更多的用法,不是吗?
  • 格式化字符串区分大小写,记忆技巧是日期大写如 YYYY MM DD,时间小写如 hh mm ss,毫秒跟星期特殊的单独记。参数格式需严格匹配,长度过多或过少均无效,如 YYYY 写成 YYY 或 YY 均无效。
  • 对第二个参数的使用,参见 distance 方法。
miment().format() // 2018-04-09 23:49:36
// 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
}

stamp

输出时间戳,不需参数。

miment().stamp()
// 1523408529932

daysInMonth

获取当前 Miment 对象所在月的天数。

miment().daysInMonth()
// 30

支持链式调用的方法

add

增加或减少时间。它接收 2 个参数:

参数名称 参数类型 参数默认值 是否必传 说明
增量 number 0 N 要增加的时间量,增加传正数,减少传负数
单位 string 无默认值 Y 要增加的时间单位
可选同 format 格式化字符串

为方便使用,单位的可选参数格式与格式化方法 format 的保持一致。同样严格匹配大小写与长度。

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 对象,我们可以在它后面继续调用 mimont 支持的方法:

miment().add(1, ‘DD‘).format()
// 2018-04-12 09:29:55

需要注意的是,当你调完返回 Computed 结果的方法后,返回的对象类型不是 Miment,故而不支持链式调用:

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‘)
// 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,即可将当前时间格式化成时间差。作为对比:

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 对象的所有方法。请移步至 MDN 查看。

需要注意的是,由于继承而来的方法是属于 Date 对象的,为保持一致,我们没有对方法做改动。故而方法无法返回 miment 对象,也无法链式调用 miment。

许可

MIT

写在最后

目前这些功能(函数),是我们团队在日常实践中碰到的比较常用的。如果你对功能有新的需求或者建议,欢迎给我们提 Issue。如果喜欢 miment,请在我的 GitHub 上给我一个 star,你的 star 就是我最大的动力了,谢谢!

原文地址:https://www.cnblogs.com/noahlam/p/8910022.html

时间: 2024-09-30 05:11:00

miment--一个比 moment 轻很多的时间库的相关文章

定时器:为 Windows 实现一个连续更新,高精度的时间供应器

原著:Johan Nilsson 翻译:lxhui 原文出处:MSDN Magazine March 2004(Timers...) 原代码下载: HighResolutionTimer.exe (404KB) 本篇文章假定你熟悉 C++ 和 Win32 API  概要   从 Windows NT 里获得的时间戳(Timestamp),根据你所使用的硬件,其最大精度为 10 到 15 毫秒.但是, 有时候你需要时间标签频繁事件时,获得更高的精度更能令人满意.举个例子,如果你要与线程打交道,或者

sandglass(沙漏)——一个让人解脱的python时间处理库

在游戏开发的过程中频繁的需要跟时间相关的做处理,而python内置了好多个时间处理库,datetime/date/time/calendar/timedelta等,细节繁多略具迷惑性.很多东西不够便捷直接. 想一下下面这些场景: 2014年六一儿童节那天的时间戳是多少? 2014年六一儿童节那天是星期几? datetime对象转成字符串后面往往带小数点,即微秒,而我存到数据库是不需要微秒的,怎么搞? 从配置中读取.网络中传输.数据库存储获取到的时间信息是字符串的,怎么转成可以用于运算的对象? 要

分享一个R语言的脚本【时间记录】

分享一个R语言的脚本 最近捣弄下一个R语言的脚本,不知道大家有没有看过<奇特的一生>这本书,我高中看了后,高三就山寨了柳比歇夫大神的方法,记录时间开销.个人感觉是挺有用的. 脚本就是把下面的这种excel文件导入并自动转化成饼形图,输出图片到本地. 代码在此: record <- read.table("Book1.csv", header=TRUE,sep=",", fill=TRUE); library(ggplot2); new_sum<

发布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播

已经上传到CSDN,下载地址:http://download.csdn.net/detail/avsuper/7421647,不要钱滴,嘿嘿... 本程序可以把摄像头视频和麦克风音频,录制为FLV文件. 视频压缩采用H.264编码,音频压缩采用AAC编码,支持同步进行RTMP直播(服务器端需要FMS/WOWZA/RED5等).可选择码率.分辨率.帧率.关键帧间隔等信息. 1号教室网(http://www.1jiaoshi.com)出品. 同时也做了一个可将屏幕和音频同步直播录制的软件,支持FLV

Struts2框架里面action与前端jsp页面进行交互路径问题---》一个对话框里面有很多超链接,进行相应的跳转

一个对话框里面有很多超链接,右边是点击超链接跳转到的相应页面(在一个页面上就相当于点击该超链接时候,就把该简短页面置顶):这个问题困扰我两天:还请大神给我解决,也没有解决,我仔细对比了相关路径,后面添加就成功了!! jsp相应路径不正确代码:1.因为这个是jsp页面,所以在访问时候就可以自动添加上相应的路径,如下图,结果不能访问,直接跳转到登录页面 浏览器上显示路径是: 2.在相应超链接前面添加获取该路径,也失败:其中${ctx}是自定义的获取浏览器地址 3.正确路径:

每天一个JavaScript实例-UTC日期和时间

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-UTC日期和时间</title> <script> window.onload = function(){ var aaa = docum

php获取上一个月的开始与结束时间遇到的问题

改正之前: $_lastMonthStart = date('Y-m-1 00:00:00', strtotime("-1 month")); $_lastMonthEnd = date('Y-m-d H:i:s', strtotime('-1 sec', strtotime($_monthStart))); $preMonthRange = [$_lastMonthStart, $_lastMonthEnd]; 想要的结果:上一个月的开始和结束时间这一范围. 出现的问题描述:5月31

造轮子 | 如何设计一个面向协议的 iOS 网络请求库

最近开源了一个面向协议设计的网络请求库 MBNetwork,基于 Alamofire 和 ObjectMapper 实现,目的是简化业务层的网络请求操作. 需要干些啥 对于大部分 App 而言,业务层做一次网络请求通常关心的问题有如下几个: 如何在任意位置发起网络请求. 表单创建.包含请求地址.请求方式(GET/POST/--).请求头等-- 加载遮罩.目的是阻塞 UI 交互,同时告知用户操作正在进行.比如提交表单时在提交按钮上显示 "菊花",同时使其失效. 加载进度展示.下载上传图片

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,