我进行了以下测试,该测试在本地工作,但在CI中失败
import { toDate } from "date-fns-tz"
import { parseISO } from "date-fns"
export function isDST(date) {
const january = new Date(date.getFullYear(), 0, 1).getTimezoneOffset()
const july = new Date(date.getFullYear(), 6, 1).getTimezoneOffset()
return Math.max(january, july) !== date.getTimezoneOffset()
}
// Fails
// Expected: true
// Received: false
it("returns true if dst applies", () => {
const date = toDate(parseISO("2021-03-28 02:00:00"), {
timeZone: "Europe/Amsterdam",
})
expect(isDST(date)).toEqual(true)
})
it("returns false if dst does not apply", () => {
const date = toDate(parseISO("2021-10-31 03:00:00"), {
timeZone: "Europe/Amsterdam",
})
expect(isDST(date)).toEqual(false)
})
如何使这个函数通用?我尝试将toDate
从date-fns-tz
应用到isDST
中的日期,但没有成功,我还尝试切换到parseISO
1条答案
按热度按时间6vl6ewon1#
@deceze为什么你可能需要知道一个日期和时间字符串是否是夏令时。下面是一个德国日期(带时区信息):
UTC时间是几点?你不能说!因为夏令时在那个星期日结束。在30. Oktober 2022 02:59 CEST之后,你将有30. Oktober 2022 02:00 CEST作为下一个时间戳。也就是说,你可以有两个时间戳,只能通过夏令时标志来区分:
1.欧洲中部时间2022年10月30日02:00
这就是你在挂钟上看到的内容。如果你不使用偏移信息,你就不能将时间戳正确地转换为UTC。这就是为什么你应该总是使用ISO 8601时间戳与偏移信息或正确的时区缩写的原因。只有这样你的日期才不会模糊。当你想打印的日期完全像在挂钟上一样时,你需要知道你的时间戳是否有DST。你打印时间戳,当它是DST时,你写CEST,否则你写CET。
事实上,如果没有时区缩写,您就无法转换夏令时期间的任何时间戳,因为您不知道它是否是一个小时(CEST)或不是(CET)。