MomentJS - 日期验证
现代日期/时间:Moment.js 中的日期验证
Section titled “现代日期/时间:Moment.js 中的日期验证”确保日期输入有效对于数据完整性至关重要。Moment.js 提供了简单的方法来验证通过其解析函数创建的日期。
isValid() 方法
Section titled “isValid() 方法”检查有效性的主要方法是 .isValid()。如果 Moment 对象表示一个有效日期,它返回 true,否则返回 false。
// 有效日期console.log(moment('2023-10-26').isValid()); // trueconsole.log(moment('26/10/2023', 'DD/MM/YYYY').isValid()); // trueconsole.log(moment({ year: 2024, month: 1, day: 29 }).isValid()); // true(2024 年 2 月 29 日有效)
// 无效日期console.log(moment('Invalid Date String').isValid()); // falseconsole.log(moment('2023-13-01', 'YYYY-MM-DD').isValid()); // false(无效月份)console.log(moment('2023-02-29', 'YYYY-MM-DD').isValid()); // false(2023 年不是闰年)console.log(moment('26/10/2023', 'YYYY-MM-DD').isValid()); // false(格式不匹配)理解解析标志
Section titled “理解解析标志”当 isValid() 返回 false 时,您通常可以通过检查 moment().parsingFlags() 提供的解析标志来获取有关日期无效的原因的更多信息。它返回一个包含多个有用标志的对象:
| 标志名称 | 描述 |
|---|---|
overflow | 表示特定单位发生溢出(例如,月份 13,日期 32)。返回溢出单位的索引(见下表),如果没有溢出则返回 -1。 |
invalidMonth | 如果因无法识别的月份名称而导致解析失败,则包含无效的月份名称字符串(例如,解析 ‘26 Foo 2023’ 时)。否则为 null。 |
invalidFormat | 布尔值。如果因输入字符串与指定格式不匹配而导致解析失败,则为 true。 |
empty | 布尔值。如果输入字符串不包含任何可解析为日期的内容(例如,moment('abc')),则为 true。 |
nullInput | 布尔值。如果输入明确为 null(例如,moment(null)),则为 true。 |
userInvalidated | 布尔值。如果日期是使用 moment.invalid() 明确创建为无效的,则为 true。 |
meridiem | 字符串(‘AM’/‘PM’)或 null。指示已解析的上午/下午标记(如果有)。 |
parsedDateParts | 数组。包含在检测到无效之前从输入中成功解析的日期部分(例如,解析 ‘2023-13-01’ 时为 [2023, 12])。用于调试溢出问题。 |
使用 invalidAt()
Section titled “使用 invalidAt()”.invalidAt() 方法是一个快捷方式,用于识别导致 overflow 的单位。它返回与溢出单位对应的索引:
| 索引 | 单位 |
|---|---|
| 0 | 年 |
| 1 | 月 |
| 2 | 日 |
| 3 | 小时 |
| 4 | 分钟 |
| 5 | 秒 |
| 6 | 毫秒 |
如果日期有效或因溢出以外的原因无效(如格式不匹配),invalidAt() 返回 -1。
const m1 = moment('2023-18-10', 'YYYY-MM-DD');console.log('m1 是否有效:', m1.isValid()); // 输出: m1 isValid: falseconsole.log('m1 无效位置:', m1.invalidAt()); // 输出: m1 invalidAt: 1 (月份溢出)console.log('m1 解析标志:', m1.parsingFlags()); // 显示 overflow: 1, parsedDateParts: [2023, 17, 10]
const m2 = moment('99/99/9999', 'DD/MM/YYYY');console.log('m2 是否有效:', m2.isValid()); // 输出: m2 isValid: falseconsole.log('m2 无效位置:', m2.invalidAt()); // 输出: m2 invalidAt: 1 (月份 99 无效)
const m3 = moment('This is not a date');console.log('m3 是否有效:', m3.isValid()); // 输出: m3 isValid: falseconsole.log('m3 无效位置:', m3.invalidAt()); // 输出: m3 invalidAt: -1console.log('m3 解析标志:', m3.parsingFlags()); // 显示 empty: true
const m4 = moment('2023-10-26', 'DD/MM/YYYY'); // 格式不匹配console.log('m4 是否有效:', m4.isValid()); // 输出: m4 isValid: falseconsole.log('m4 无效位置:', m4.invalidAt()); // 输出: m4 invalidAt: -1console.log('m4 解析标志:', m4.parsingFlags()); // 显示 invalidFormat: true通过结合使用 isValid()、invalidAt() 和 parsingFlags(),您可以有效地诊断日期输入的问题。