{"id":13447463,"url":"https://github.com/noahlam/Miment","last_synced_at":"2025-03-22T01:31:00.600Z","repository":{"id":41364456,"uuid":"128502171","full_name":"noahlam/Miment","owner":"noahlam","description":"a fast,light weight,simple and non-dependencies datetime library for javascript ( mini moment )","archived":false,"fork":false,"pushed_at":"2019-05-16T02:18:09.000Z","size":153,"stargazers_count":336,"open_issues_count":6,"forks_count":31,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-15T21:40:30.739Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noahlam.png","metadata":{"files":{"readme":"README-cn.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-04-07T06:18:13.000Z","updated_at":"2025-03-05T01:41:44.000Z","dependencies_parsed_at":"2022-09-05T11:40:51.868Z","dependency_job_id":null,"html_url":"https://github.com/noahlam/Miment","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noahlam%2FMiment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noahlam%2FMiment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noahlam%2FMiment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noahlam%2FMiment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noahlam","download_url":"https://codeload.github.com/noahlam/Miment/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244893388,"owners_count":20527584,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T05:01:18.524Z","updated_at":"2025-03-22T01:31:00.266Z","avatar_url":"https://github.com/noahlam.png","language":"JavaScript","readme":"# Miment\n\n\n## 介绍\nMiment (\"Mini Moment\") 是一个轻量级的时间库，打包压缩后体积 ~1K，没有过多的方法。它的上手成本几乎为零，无需反复查阅文档。当你只需要 Moment 的若干核心能力但又不希望使你的包体积膨胀时，欢迎尝试 Miment。\n\n[![Build Status](https://travis-ci.org/noahlam/Miment.svg?branch=master)](https://travis-ci.org/noahlam/Miment)\n[![Badge Size](https://img.badgesize.io/https://unpkg.com/miment/dist/miment-min.js?compression=gzip\u0026amp;label=size\u0026amp;maxAge=300)](https://unpkg.com/miment/dist/miment-min.js)\n[![Version](https://img.shields.io/npm/v/miment.svg?maxAge=300\u0026label=version\u0026colorB=007ec6\u0026maxAge=300)](./package.json)\n[![LICENSE](https://img.shields.io/npm/l/miment.svg?maxAge=300)](./LICENSE)\n\n* [English README](./README.md)\n* [更新日志](./update_log.md)\n* [查看示例](https://noahlam.github.io/Miment)\n\n\u003e  首先致敬一下 Moment，非常好用的一个时间库。我本身也是 Moment 重度使用者，用习惯了 Moment，一碰到需要处理时间的需求立马 Moment。不过有时候想想，Moment 给我们提供了那么多的功能，但是我们天天用的，也就那么一两个。刚好最近在写微信小程序，然后在页面引入 Moment，打包完，包竟然大了 200 多 K，把 Moment 去掉，就直接少掉 200 多 K。反复试了好几次，确定一个 Moment 在小程序里面，占用大概 200K 的空间。于是就想自己写一个类似 Moment 的精简的时间库，于是就有了这个。为什么要叫 Miment 呢？其实刚开始我是想叫 Mini-Moment 的，但是考虑到以后可能会经常使用到，打 2 个单词中间还要加一个横杆太累了，所以就把 Mini-Moment 缩水成 Miment 了。\n\n\n\n## 安装\n对浏览器环境，在页面引入 `./dist/miment.min.js` 即可：\n\n``` html\n\u003cscript src=\"https://unpkg.com/miment/dist/miment.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  miment().format('YYYY/MM/DD hh-mm-ss SSS') // 2018/04/09 23-49-36 568\n\u003c/script\u003e\n```\n\n在 NPM 生态中使用时，请使用包管理器安装 Miment：\n\n```\nnpm i miment\n```\n\n然后就可以在你的项目中使用了：\n\n``` js\nimport miment from 'miment'\nmiment().format('YYYY/MM/DD hh-mm-ss SSS') // 2018/04/09 23-49-36 568\n```\n\n## API\n\nAPI 方法可分为三类：\n\n* 返回 Computed 结果的方法。如 `format` 返回字符串，`json` 返回的是一个 JSON 对象。\n* 返回 `Miment` 对象的方法，即支持链式调用。\n* 从 Date 对象继承的方法。Date 对象上的方法 miment 也可以使用，这些方法类似私有 API，不推荐直接使用。\n\n\n### 返回 Computed 结果的方法\n\n#### `format`\nformat 方法几乎是我们平时最常用的了。它一共接收 2 个参数，这 2 个参数都有默认值，不传则使用默认值：\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e参数名称\u003c/td\u003e\n    \u003ctd\u003e参数类型\u003c/td\u003e\n    \u003ctd\u003e参数默认值\u003c/td\u003e\n    \u003ctd\u003e是否必传\u003c/td\u003e\n    \u003ctd\u003e说明\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e格式化的字符串\u003c/td\u003e\n    \u003ctd\u003estring\u003c/td\u003e\n    \u003ctd\u003e'YYYY-MM-DD hh:mm:ss'\u003c/td\u003e\n    \u003ctd\u003eN\u003c/td\u003e\n    \u003ctd\u003e\n      年 YYYY\u003cbr\u003e\n      月 MM\u003cbr\u003e\n      日 DD\u003cbr\u003e\n      时 hh\u003cbr\u003e\n      分 mm\u003cbr\u003e\n      秒 ss\u003cbr\u003e\n      毫秒 SSS\u003cbr\u003e\n      数字星期 ww\u003cbr\u003e\n      中文星期 WW\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e是否为时间差\u003c/td\u003e\n    \u003ctd\u003eboolean\u003c/td\u003e\n    \u003ctd\u003efalse\u003c/td\u003e\n    \u003ctd\u003eN\u003c/td\u003e\n    \u003ctd\u003e格式化 distance 时间差时，使用 true\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n* 本着简单的原则，我们没有实现特别灵活的格式化方式。有时灵活也意味着学习成本：你需要记忆更多的用法，不是吗？\n* 格式化字符串**区分大小写**，记忆技巧是日期大写如 `YYYY MM DD`，时间小写如 `hh mm ss`，毫秒跟星期特殊的单独记。参数格式需严格匹配，长度过多或过少均无效，如 `YYYY` 写成 `YYY` 或 `YY` 均无效。\n* 对第二个参数的使用，参见 `distance` 方法。\n\n``` js\nmiment().format() // 2018-04-09 23:49:36\n// 2018-04-09 23:49:36\n\nmiment().format('YYYY/MM/DD hh-mm-ss SSS')\n// 2018/04/09 23-49-36 568\n\nmiment().format('YYYY年MM月DD日 星期WW')\n// 2018年04月09日 星期一\n\nmiment().format('YYYY年MM月DD日 星期ww')\n// 2018年04月09日 星期1 *周日对应星期0*\n```\n\n作为扩展，如果我们只想获取单独的年、月或日，可这样使用：\n\n``` js\nmiment().format('YYYY') // 2018\nmiment().format('MM') // 04\nmiment().format('DD') // 09\nmiment().format('hh') // 23\nmiment().format('mm') // 57\nmiment().format('ss') // 16\nmiment().format('SSS') // 063\nmiment().format('ww') // 1\nmiment().format('WW') // 一\n```\n\n基于这个方法，你可以不需要记忆大部分原生的日期方法（如 `getFullYear` / `getDate` / `getDay` 等），使用统一的 `format` 处理各种需求。\n\n#### `json`\n输出 JSON 格式的时间字段：\n\n``` js\nmiment().json()\n```\n\n``` json\n{\n  \"year\": 2018,\n  \"month\": 4,\n  \"date\": 11,\n  \"hour\": 8,\n  \"minute\": 57,\n  \"second\": 41,\n  \"day\": 3,\n  \"millisecond\": 87\n}\n```\n\n#### `diff` 计算两个时间的毫秒差\n\n```js\nmiment('2018-05-05 00:00:00').diff('2018-05-05 00:00:01')\n// -1000\nmiment().diff('2018-05-05 00:00:00','2018-05-05 00:00:01')\n// -1000\n```\n\n#### `stamp`\n输出时间戳，不需参数。\n\n``` js\nmiment().stamp()\n// 1523408529932\n```\n\n#### `get`\n输出给定单位的时间值 参数跟返回值都跟format一样,但是性能比format好很多\n```js\nmiment().get('YYYY')\n// 2018\n```\n#### `daysInMonth`\n获取当前 `Miment` 对象所在月的天数。\n\n``` js\nmiment().daysInMonth()\n// 30\n```\n#### `isBefore` 接收一个参数作为`被比较的时间`\n判断当前时间 是否早于参数 返回一个布尔值\n\n``` js\nmiment().isBefore('2000-01-01')\n// false\nmiment().isBefore('2020-01-01')\n// true\n```\n#### `isAfter` 接收一个参数作为`被比较的时间`\n判断当前时间 是否晚于参数 返回一个布尔值\n\n``` js\nmiment().isAfter('2000-01-01')\n// true\nmiment().isAfter('2020-01-01')\n// false\n```\n#### `isBetween` 接收两个参数作为`被比较的时间`\n判断当前时间 是否介于两个参数之间,参数不分先后顺序，两个参数位置可以任意对调\n\n``` js\nmiment().isBetween('2000-01-01','2020-01-01')\n// true\n```\n\n### 支持链式调用的方法\n\n#### `add` 和 `sub`\n增加或减少时间。它们接收 2 个参数：\n\n\u003ctable style='border-collapse:collapse;'\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e参数名称\u003c/td\u003e\n    \u003ctd\u003e参数类型\u003c/td\u003e\n    \u003ctd\u003e参数默认值\u003c/td\u003e\n    \u003ctd\u003e是否必传\u003c/td\u003e\n    \u003ctd\u003e说明\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e增量\u003c/td\u003e\n    \u003ctd\u003enumber\u003c/td\u003e\n    \u003ctd\u003e0\u003c/td\u003e\n    \u003ctd\u003eN\u003c/td\u003e\n    \u003ctd\u003e要增加的时间量，增加传正数，减少传负数\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e单位\u003c/td\u003e\n    \u003ctd\u003estring\u003c/td\u003e\n    \u003ctd\u003e无默认值\u003c/td\u003e\n    \u003ctd\u003eY\u003c/td\u003e\n    \u003ctd\u003e\n      要增加的时间单位\u003cbr\u003e\n      可选同 format 格式化字符串\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n为方便使用，**单位**的可选参数格式与格式化方法 `format` 的保持一致。同样严格匹配大小写与长度。\n\n``` js\nmiment().add(1, 'DD') // 增加一天\nmiment().add(1, 'YYYY').add(2, 'MM').add(-3, 'DD') // 增加 1 年 2 个月又减回 3 天\nmiment().add(-1, 'ww') // 减去一周，即获取上周的日期\nmiment().add(500,SSS) // 增加 500 毫秒\n```\n\n`add` 和 `sub` 返回的值是`增加/减少`完后的 `Miment` 对象，我们可以在它后面继续调用 mimont 支持的方法:\n\n``` js\nmiment().add(1, 'DD').format()\n// 2018-04-12 09:29:55\n```\n\n需要注意的是，当你调完返回 Computed 结果的方法后，返回的对象类型不是 `Miment`，故而不支持链式调用：\n\n```\nmiment().add(1, 'DD').format().add(1, 'DD') // 报错\n```\n\n#### `set`\n设置当前时间为一个固定值,用法跟参数都同`add/sub`\n``` js\nmiment('2018-05-05 00:00:00').set(1999, 'YYYY').format()\n// 1999-05-05 00:00:00\n```\n\n#### `distance`\n计算 2 个时间的距离。它接收 2 个参数，返回一个 `Miment` 对象：\n\n\u003ctable style='border-collapse:collapse;'\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e参数名称\u003c/td\u003e\n    \u003ctd\u003e参数类型\u003c/td\u003e\n    \u003ctd\u003e参数默认值\u003c/td\u003e\n    \u003ctd\u003e是否必传\u003c/td\u003e\n    \u003ctd\u003e说明\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e起始时间\u003c/td\u003e\n    \u003ctd\u003emiment/date/number/string\u003c/td\u003e\n    \u003ctd\u003e无\u003c/td\u003e\n    \u003ctd\u003eY\u003c/td\u003e\n    \u003ctd\u003e接受4种类型参数，会自动转换\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e结束时间\u003c/td\u003e\n    \u003ctd\u003emiment/date/number/string\u003c/td\u003e\n    \u003ctd\u003e无\u003c/td\u003e\n    \u003ctd\u003eN\u003c/td\u003e\n    \u003ctd\u003e同上\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n* 只传一个起始时间时，返回 **起始时间 - miment 当前时间**\n* 提供起始时间和结束时间时，返回 **起始时间 - 结束时间**。相减顺序如何？先出现的减去后出现的：\n\n``` js\nmiment().distance('2018-04-10 00:00:00')\n// Mon Dec 29 1969 22:11:51 GMT+0800 (CST)\n\nmiment().distance(1523408529932)\n// Wed Dec 31 1969 07:13:47 GMT+0800 (CST)\n```\n\n``` js\nmiment().distance('2018-04-10 00:00:00')\n// Mon Dec 29 1969 22:11:51 GMT+0800 (CST)\n\nmiment().distance(1523408529932)\n// Wed Dec 31 1969 07:13:47 GMT+0800 (CST)\n\nmiment().distance('2018-04-10 00:00:00', new Date())\n// Mon Dec 29 1969 22:11:13 GMT+0800 (CST)\n\nmiment().distance('2018-04-10 00:00:00', '2018-04-11 00:00:00')\n// Mon Dec 29 1969 22:10:46 GMT+0800 (CST)\n```\n\n你一定注意到了，为什么 `distance` 方法返回的年份是 1969 年呢？这实际上是基于`1970-01-01 00:00:00` 的毫秒数，参见 [Unix 时间](https://en.wikipedia.org/wiki/Unix_time)，而我们把两个时间相减，得到的可能是一个相对很小的时间戳（还可能是负数)，所以离 1970 很近。\n\n那我们要怎么显示我们能看得懂的时间呢？配合 `format` 即可。`format` 的第二个参数是用于用来格式化 `distance` 计算出的时间差，只要把第二个参数设为 `true`，即可将当前时间格式化成时间差。作为对比：\n\n``` js\nmiment().distance(1523408529932).format('YYYY年MM月DD日 hh时mm分ss秒')\n// 1969年12月30日 00时52分16秒\n\nmiment().distance(1523408529932).format('YYYY年MM月DD日 hh时mm分ss秒', false)\n// 1969年12月30日 00时52分16秒\n```\n\n把第二个参数设为 `true`：\n\n``` js\nmiment().distance(1523408529932).format('YYYY年MM月DD日 hh时mm分ss秒', true)\n// 00年01月03日 23时08分23秒\n```\n\n#### `firstDayOfWeek`\n获取本周的第一天（周日），无参数：\n\n``` js\nmiment().firstDayOfWeek() // Sun Apr 08 2018 11:27:55 GMT+0800 (CST)\nmiment().firstDayOfWeek().format() // 2018-04-08 11:27:55\n```\n\n如果想获取周一呢？周二、三、四、五、六呢？\n\n``` js\nmiment().firstDayOfWeek().add(1, 'DD').format()\n// 2018-04-09 11:27:55\n```\n\n#### `firstDay`\n获取每个月的第一天，无参数：\n\n``` js\nmiment().firstDay() // Sun Apr 01 2018 00:00:00 GMT+0800 (CST)\nmiment().firstDay().format() // 2018-04-01 00:00:00\n```\n\n#### `lastDay`\n获取每个月的最后一天，无参数：\n\n``` js\nmiment().lastDay()\n// Mon Apr 30 2018 00:00:00 GMT+0800 (CST)\n\nmiment().lastDay().format()\n// 2018-04-30 00:00:00\n```\n\n### Date 自有方法\n\n`Miment` 继承自 Date 对象，所以也拥有 Date 对象的所有方法。请移步至 [MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date) 查看。\n\n需要注意的是，由于继承而来的方法是属于 Date 对象的，为保持一致，我们没有对方法做改动。故而方法无法返回 miment 对象，也无法链式调用 miment。\n\n\n## 许可\nMIT\n\n## 写在最后\n目前这些功能（函数），是我们团队在日常实践中碰到的比较常用的。如果你对功能有新的需求或者建议，欢迎给我们提 [Issue](https://github.com/noahlam/Miment/issues)。如果喜欢 miment，请在我的 [GitHub](https://github.com/noahlam/Miment) 上给我一个 star，你的 star 就是我最大的动力了，谢谢！\n","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoahlam%2FMiment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoahlam%2FMiment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoahlam%2FMiment/lists"}