在 JavaScript 中将类似日期格式的倒计时转换为毫秒

Convert a countdown like date format to milliseconds in JavaScript

我必须将这种 countdown-like Date 格式 0d0h0m0s 转换为毫秒。该格式可以选择具有 0d0h0m 标题值,因此允许值为

1d23h10m
0d12h0m
12h0m
0m0s
0m10s
10s

虽然至少需要一个尾随 0s 格式值,但 0 值对于每个 dhm 格式都是可选的,因此 0m5s5s 都是允许的值。

因为这个函数每秒会应用 N 次。 (N 在 10 到 100 之间),每个函数执行时间都有性能约束。

注意。可以使用简单的 Regex 模式将 /[dhms]/gi 之类的字符串拆分为 dayhourminutesseconds 的日期组件,但我一直在寻找一种日期格式安全的方法。

一种选择是使用正则表达式提取所有匹配项,然后根据需要进行乘法和求和:

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));
});