简单情况下带有 date-fns 的奇怪格式持续时间

问题描述 投票:0回答:1

我有一个奇怪的格式案例,其中包含 date-fns 和格式化持续时间。如果有人知道我做错了什么:

function formatDuration(duration) {
  return duration >= 60000 * 60
    ? format(new Date(duration), "hh 'h', mm 'min', ss 'sec'")
    : duration >= 60000
      ? format(new Date(duration), "mm 'min', ss 'sec'")
      : format(new Date(duration), "ss 'sec'");
}

我的期望:

formatDuration((59 * 60 + 59) * 1000); // '59 min, 59 sec'
formatDuration((60 * 60) * 1000); // '01 h 00 min, 00 sec'

我得到了什么:

formatDuration((59 * 60 + 59) * 1000); // '59 min, 59 sec'
formatDuration((60 * 60) * 1000); // '02 h 00 min, 00 sec'

在第二种情况下,不知何故出现了额外的一个小时。我不明白问题出在哪里。任何想法 ?谢谢!

node.js date-fns
1个回答
0
投票

因为您创建了

new Date(duration)
,所以
duration
被解释为时间戳,即从 01-Jan-1970 00:00:00 UTC 开始。

但是 date-fns 按原样获取该 Date 对象,并在当前 JS 引擎的语言环境中解释它,例如如果您冬天在法国本土,则采用 UTC+1。所以午夜 UTC 已经是 UTC+1 的凌晨 1 点了。因此你需要额外的 1 小时。

如果您只处理持续时间,您可以适当地划分毫秒数,而不必经历转换日期和时区的麻烦。

另一个简单的解决方案是确保也在本地时区创建日期,例如通过添加其偏移量:

const offset = (new Date()).getTimezoneOffset() * 60 * 1000;

// Then...
format(date, "hh 'h', mm 'min', ss 'sec'")

现场演示:https://plnkr.co/edit/OZF7PiCjZfmCEHpN?open=lib%2Fscript.js

请注意,对于持续时间超过一个月的情况,这仍然会带来奇怪的影响,因为它假设持续时间是 1970 年 1 月 1 日(不是闰年等)。

© www.soinside.com 2019 - 2024. All rights reserved.