在 JavaScript 中将类似日期格式的倒计时转换为毫秒
Convert a countdown like date format to milliseconds in JavaScript
我必须将这种 countdown-like 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
的日期组件,但我一直在寻找一种日期格式安全的方法。
一种选择是使用正则表达式提取所有匹配项,然后根据需要进行乘法和求和:
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 天,或类似的东西),这样的调整将很容易实现。
鉴于字符串很短,简单的字符解析器是使用正则表达式的实用替代方法。以下符合 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));
});
我必须将这种 countdown-like 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
的日期组件,但我一直在寻找一种日期格式安全的方法。
一种选择是使用正则表达式提取所有匹配项,然后根据需要进行乘法和求和:
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 天,或类似的东西),这样的调整将很容易实现。
鉴于字符串很短,简单的字符解析器是使用正则表达式的实用替代方法。以下符合 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));
});