我有一个奇怪的格式案例,其中包含 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'
在第二种情况下,不知何故出现了额外的一个小时。我不明白问题出在哪里。任何想法 ?谢谢!
因为您创建了
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 日(不是闰年等)。