gpt4 book ai didi

javascript - Node.js - 检查字符串是否表示大量元素的有效日期时间的最快方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 23:03:05 26 4
gpt4 key购买 nike

检查有效日期时间的最快方法是什么?我不仅需要考虑字符串包含年、月、日、小时和分钟,还需要考虑日期时间是否有效,例如:2017-02-29 10:00 应被视为无效,因为它在非闰年是 29 日。

我有一个字符串元素数组(300k 元素),格式为:YYYYMMDDHHmm,我需要尽可能以最快方式检查每一行。

使用 moment.js 检查每个元素的有效性在常规 for 循环中需要大约 5s:

for (let i = 0; i < length; i++) {
let el = datetimes[i];
let d = moment.utc(el, "YYYYMMDDHHmm");
d.isValid();
}

是否有更快的替代方案?

最佳答案

在调用任何类型的字符串匹配器或正则表达式之前尽可能多地排除。

moment 每次都会计算该表达式。 (除非已经开始进行创意缓存)

您可以先检查假值(undefined、null、0、'' 等)。

if (!el) {
// not valid
}

检查null和undefined后可以检查长度(感谢Luca)

if (el.length !== 12) {
// not valid
}

您还可以预编译一个 REGEX 并使用它。

// define this outside of your loop
let rx2 = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})$/

function leapYear(year) {
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}

function checkValidDate(strDate) {
if (!strDate || strDate.length !== 12) throw new Error('invalid date')
let m = rx2.exec(strDate)
if (!m) throw new Error('invalid date')

let year = parseInt(m[1])
if (year < 2000 || year >= 2100) throw new Error('bad year')

let month = parseInt(m[2])
if (month > 11) throw new Error('bad month')

let day = parseInt(m[3])
// base 0 days and months
switch (month) {
case 0, 2, 4, 5, 6, 7, 9, 11:
if (day > 30) throw new Error('bad day')
break;
case 3, 5, 8, 10:
if (day > 29) throw new Error('bad day')
break;
case 1:
if (day > 28) throw new Error('bad day')
if (day === 28 && !isLeapYear(year)) throw new Error('bad day')
break;
}

let hour = parseInt(m[4])
if (hour > 23) throw new Error('bad hour')

let minute = parseInt([5])
if (hour > 59) throw new Error('bad minute')
}

try {
checkValidDate('asdf')
console.log('valid')
} catch (e) {
console.error(e)
}

try {
checkValidDate('200011241230')
console.log('valid')
} catch (e) {
console.error(e)
}

try {
checkValidDate('200001300000')
console.log('valid')
} catch (e) {
console.error(e)
}

关于javascript - Node.js - 检查字符串是否表示大量元素的有效日期时间的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51744867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com