Moment.js 是一個在 JavaScript 中處理日期非常有幫助的庫。
Moment.js 是一個非常棒的 JavaScript 库,可以幫助你處理日期,不管是在瀏覽器上還是在 Node.js 中都可以使用。
這篇文章旨在解釋這個庫的基本知識和最常見的用法。
安裝
你可以直接在你的頁面中使用 script 標籤引入它,從 unpkg.com:
<script src="https://unpkg.com/moment" />
或者使用 npm 安裝:
npm install moment
如果你使用 npm 安裝,需要用 import 引入這個包(使用 ES 模块):
import moment from 'moment'
或者用 require 引入它(使用 CommonJS):
const moment = require('moment')
獲取當前日期和時間
const date = moment()
解析日期
你可以通過傳遞一個字符串給 moment 對象來初始化它。
const date = moment(string)
它可以接受任意字符串,按照以下順序解析:
- ISO 8601
- RFC 2822 日期時間格式
- Date 對象接受的格式
ISO 8601 絕對是最方便的。這是一個格式參考:
| 格式 | 意義 | 範例 | 
|---|---|---|
| YYYY | 4 位數年份 | 2018 | 
| YY | 2 位數年份 | 18 | 
| M | 2 位數月份,忽略前導 0 | 7 | 
| MM | 2 位數月份 | 07 | 
| MMM | 3 字母月份名稱 | Jul | 
| MMMM | 完整的月份名稱 | July | 
| dddd | 完整的星期名稱 | Sunday | 
| gggg | 4 位數年份的星期 | 2018 | 
| gg | 2 位數年份的星期 | 18 | 
| w | 不帶前導零的一年中的星期數 | 18 | 
| ww | 帶有前導零的一年中的星期數 | 18 | 
| e | 星期的第幾天,從 0 開始 | 4 | 
| D | 2 位數的日期,忽略前導 0 | 9 | 
| DD | 2 位數的日期 | 09 | 
| Do | 帶序數的日期 | 9th | 
| T | 表示時間部分的開始 | |
| HH | 2 位數的小時(24 小時制),從 0 到 23 | 22 | 
| H | 2 位數的小時(24 小時制),從 0 到 23,不帶前導 0 | 22 | 
| kk | 2 位數的小時(24 小時制),從 1 到 24 | 23 | 
| k | 2 位數的小時(24 小時制),從 1 到 24,不帶前導 0 | 23 | 
| a/A | 上午或者下午 | 下午 | 
| hh | 2 位數的小時(12 小時制) | 11 | 
| mm | 2 位數的分鐘 | 22 | 
| ss | 2 位數的秒數 | 40 | 
| s | 2 位數的秒數,不帶前導零 | 40 | 
| S | 1 位數的毫秒數 | 1 | 
| SS | 2 位數的毫秒數 | 12 | 
| SSS | 3 位數的毫秒數 | 123 | 
| Z | 時區 | +02:00 | 
| x | 毫秒級的 UNIX 時間戳 | 1410432140575 | 
設置日期
格式化日期
當你想要輸出普通的 JavaScript Date 對象的內容時,你只有很少的選擇來確定格式。你只能使用內置的方法,使用它們來組成你想要的日期。
Moment 提供了一個方便的方法來根據你的需要格式化日期,使用 format() 方法:
date.format(string)
字符串格式接受和我在“解析日期”部分中描述的相同的格式。
例如:
moment().format("YYYY Do MM")
Moment 提供了一些常量,你可以使用它們來代替自己編寫格式:
| 常量 | 格式 | 範例 | 
|---|---|---|
| moment.HTML5_FMT.DATETIME_LOCAL | YYYY-MM-DDTHH:mm | 2017-12-14T16:34 | 
| moment.HTML5_FMT.DATETIME_LOCAL_SECONDS | YYYY-MM-DDTHH:mm:ss | 2017-12-14T16:34:10 | 
| moment.HTML5_FMT.DATETIME_LOCAL_MS | YYYY-MM-DDTHH:mm:ss.SSS | 2017-12-14T16:34:10.234 | 
| moment.HTML5_FMT.DATE | YYYY-MM-DD | 2017-12-14 | 
| moment.HTML5_FMT.TIME | HH:mm | 16:34 | 
| moment.HTML5_FMT.TIME_SECONDS | HH:mm:ss | 16:34:10 | 
| moment.HTML5_FMT.TIME_MS | HH:mm:ss.SSS | 16:34:10.234 | 
| moment.HTML5_FMT.WEEK | YYYY-[W]WW | 2017-W50 | 
| moment.HTML5_FMT.MONTH | YYYY-MM | 2017-12 | 
驗證日期
可以使用 isValid() 方法來檢查任何一個日期是否有效:
moment('2018-13-23').isValid() //false
moment('2018-11-23').isValid() //true
過去和未來的時間
使用 fromNow()。字符串會被本地化:
moment('2016-11-23').fromNow() //2 年前
moment('2018-05-23').fromNow() //一個月前
moment('2018-11-23').fromNow() //在 5 個月內
如果你給 fromNow() 傳遞 true,它只顯示差異,而不涉及將來或過去。
moment('2016-11-23').fromNow(true) //2 年
moment('2018-05-23').fromNow(true) //一個月
moment('2018-11-23').fromNow(true) //5 個月
操作日期
你可以對日期添加或減去任意數量的時間:
moment('2016-11-23').add(1, 'years')
moment('2016-11-23').subtract(1, 'years')
可以使用以下值:
- years
- quarters
- months
- weeks
- days
- hours
- minutes
- seconds
- milliseconds