我必须将这种类似倒计时的Date
格式0d0h0m0s
转换为毫秒。格式可以选择具有0d
,0h
,0m
标题值,因此允许的值是
1d23h10m
0d12h0m
12h0m
0m0s
0m10s
10s
虽然至少需要一个结尾的0s
格式值,但是0
值对于每种dhm
格式都是可选的,因此0m5s
和5s
都是允许的值。
由于此功能每秒将应用N次。 (N介于10到100之间),每个函数执行时间都有一个性能约束。
注意。可以使用简单的Regex
模式将类似/[dhms]/gi
的字符串拆分为day
,hour
,minutes
和seconds
的日期分量,但我一直在寻找一种使用日期格式的安全方法。
答案 0 :(得分:2)
一种选择是使用正则表达式提取所有匹配项,然后根据需要相乘和求和:
const re = /(?:(\d+)y)?(?:(\d+)m)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?/;
const toSeconds = input => {
const [, years, months, days, hours, minutes, seconds] = input.match(re);
// console.log({years, months, days, hours, minutes, seconds})
const totalDays = ((years || 0) * 365)
+ ((months || 0) * 30)
+ (days || 0);
const totalSeconds = totalDays * 24 * 3600
+ ((hours || 0)*3600)
+ ((minutes || 0) * 60)
+ (seconds || 0)
return totalSeconds * 1000;
};
`1d23h10m
0d12h0m
12h0m
0m0s
0m10s
10s`.split('\n').forEach(str => console.log(toSeconds(str)));
当然,如果您要进行其他计算(例如每年365.25天或类似的计算),则这种调整很容易实现。
答案 1 :(得分:1)
鉴于字符串较短,因此简单的字符解析器是使用正则表达式的一种实用选择。以下符合ECMAScript 2011:
function parseTime(s) {
var tokens = {d:8.64e7, h:3.6e6, m:6e4, s:1e3};
var buff = '';
return s.split('').reduce(function (ms, c) {
c in tokens? (ms += buff * tokens[c]) && (buff = '') : buff += c;
return ms;
}, 0);
}
// Examples
['1d23h10m','0d12h0m','12h0m','0m0s','0m10s','10s','1d1s'].forEach(function(s) {
console.log(s + ' => ' + parseTime(s));
});