MomentJS - 解析日期和时间
现代日期/时间处理:使用 Moment.js 进行解析
Section titled “现代日期/时间处理:使用 Moment.js 进行解析”解析是将原始输入(如字符串、对象或数组)转换为 Moment.js 可以理解和操作的结构化日期/时间对象的过程。Moment.js 提供了灵活的解析能力。
一如既往,在为新开发选择工具时,请记住 Moment.js 的维护状态。
创建 Moment 对象(解析)
Section titled “创建 Moment 对象(解析)”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)的月份/星期名称进行解析。 |
检查创建数据
Section titled “检查创建数据”有时查看 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/