Skip to content

MomentJS - 日期验证

现代日期/时间:Moment.js 中的日期验证

Section titled “现代日期/时间:Moment.js 中的日期验证”

确保日期输入有效对于数据完整性至关重要。Moment.js 提供了简单的方法来验证通过其解析函数创建的日期。

检查有效性的主要方法是 .isValid()。如果 Moment 对象表示一个有效日期,它返回 true,否则返回 false。

// 有效日期
console.log(moment('2023-10-26').isValid()); // true
console.log(moment('26/10/2023', 'DD/MM/YYYY').isValid()); // true
console.log(moment({ year: 2024, month: 1, day: 29 }).isValid()); // true(2024 年 2 月 29 日有效)
// 无效日期
console.log(moment('Invalid Date String').isValid()); // false
console.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(格式不匹配)

当 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() 方法是一个快捷方式,用于识别导致 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: false
console.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: false
console.log('m2 无效位置:', m2.invalidAt()); // 输出: m2 invalidAt: 1 (月份 99 无效)
const m3 = moment('This is not a date');
console.log('m3 是否有效:', m3.isValid()); // 输出: m3 isValid: false
console.log('m3 无效位置:', m3.invalidAt()); // 输出: m3 invalidAt: -1
console.log('m3 解析标志:', m3.parsingFlags()); // 显示 empty: true
const m4 = moment('2023-10-26', 'DD/MM/YYYY'); // 格式不匹配
console.log('m4 是否有效:', m4.isValid()); // 输出: m4 isValid: false
console.log('m4 无效位置:', m4.invalidAt()); // 输出: m4 invalidAt: -1
console.log('m4 解析标志:', m4.parsingFlags()); // 显示 invalidFormat: true

通过结合使用 isValid()、invalidAt() 和 parsingFlags(),您可以有效地诊断日期输入的问题。

更多详情请参考文档:https://momentjs.com/docs/#/parsing/is-valid/