在JavaScript中将倒数日期格式转换为毫秒格式

时间:2018-08-03 10:03:03

标签: javascript date date-format

我必须将这种类似倒计时的Date格式0d0h0m0s转换为毫秒。格式可以选择具有0d0h0m标题值,因此允许的值是

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

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

由于此功能每秒将应用N次。 (N介于10到100之间),每个函数执行时间都有一个性能约束。

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

2 个答案:

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