Skip to content

MomentJS - 解析日期和时间

现代日期/时间处理:使用 Moment.js 进行解析

Section titled “现代日期/时间处理:使用 Moment.js 进行解析”

解析是将原始输入(如字符串、对象或数组)转换为 Moment.js 可以理解和操作的结构化日期/时间对象的过程。Moment.js 提供了灵活的解析能力。

一如既往,在为新开发选择工具时,请记住 Moment.js 的维护状态。

moment() 函数是创建 Moment 对象的主要方式。它能智能地解析各种输入类型:

输入类型示例及说明
无输入(当前时间)moment()
创建表示当前日期和时间的 Moment 对象。
字符串 (ISO 8601 & RFC 2822)moment('2023-10-26T10:30:00')
moment('Thu, 26 Oct 2023 10:30:00 GMT')
Moment 会尝试自动解析标准格式。
字符串 + 格式moment('26/10/2023', 'DD/MM/YYYY')
当字符串格式非标准或存在歧义时至关重要。令牌与 .format() 中使用的相匹配。强烈推荐以提高可靠性。
字符串 + 多种格式moment('26-Oct-2023', ['DD/MM/YYYY', 'DD-MMM-YYYY'])
Moment 按顺序尝试格式,直到找到匹配项。
对象moment({ year: 2023, month: 9, day: 26, hour: 10, minute: 30 })
键对应于日期/时间单位。月份是 0 索引的 (0 = 一月, 9 = 十月)。未指定的单位默认为可能的最低值(例如,小时/分钟/秒为 0)。
原生 Date 对象moment(new Date(2023, 9, 26))
从标准的 JavaScript Date 对象创建 Moment 对象。请记住原生的 Date 月份也是 0 索引的。
数组moment([2023, 9, 26, 10, 30, 0])
模仿 new Date() 的参数:[year, month, day, hour, minute, second, millisecond]。月份是 0 索引的。
Unix 时间戳(毫秒)moment(1698316200000)
解析自 Unix 时间戳(Unix Epoch)(1970 年 1 月 1 日 UTC)以来的毫秒数。
Unix 时间戳(秒)moment.unix(1698316200)
使用 moment.unix() 获取自 Unix 时间戳(Unix Epoch)以来的秒数。
克隆 Moment 对象const original = moment();
const clone = moment(original); 或 const clone = original.clone();
创建一个具有相同日期/时间值的新独立 Moment 对象。这对于避免无意中修改原始 Moment 对象至关重要(参见“操作”部分)。
UTC 模式moment.utc()
moment.utc('2023-10-26')
moment.utc([2023, 9, 26])
将输入解析为 UTC 时间,忽略本地时区。
解析时区moment.parseZone('2023-10-26T10:30:00+02:00')
解析字符串并保留其中包含的时区偏移量,而不是转换为本地时间或 UTC 时间。
严格解析moment('26/10/2023', 'DD/MM/YYYY', true); // 严格模式
moment('26/10/XYZ', 'DD/MM/YYYY', true).isValid(); // false
要求输入严格匹配格式字符串(不允许宽松解析)。
本地化感知解析moment('26 octobre 2023', 'D MMMM YYYY', 'fr');
使用指定区域设置(locale)的月份/星期名称进行解析。

有时查看 Moment 是如何解析输入的非常有用,尤其是在调试无效日期时:

const m = moment('2023/10/26', 'DD/MM/YYYY');
console.log(m.creationData());
/* 示例输出:
{
input: '2023/10/26',
format: 'DD/MM/YYYY',
locale: Locale {_abbr: 'en', ...},
isUTC: false,
strict: false
}
*/

此对象包含有关输入字符串、使用的格式、区域设置(locale)以及解析标志的详细信息。有关 overflow、invalidMonth 等标志的更多信息,请参阅“验证”部分。

  • 始终指定格式:解析非严格 ISO 8601 格式的字符串时,务必提供格式字符串(moment(inputString, formatString)),以避免歧义和解析错误。
  • 使用严格解析:对于关键输入,考虑启用严格解析(将 true 作为第三个参数),以确保数据完整性。
  • 注意 0 索引的月份:请记住,从对象或数组解析时,月份是 0 索引的(一月=0,十二月=11)。

详细的解析选项可以在官方文档中找到:https://momentjs.com/docs/#/parsing/