Jest.js 如何创建DST的通用检查?

wvyml7n5  于 2023-03-11  发布在  Jest
关注(0)|答案(1)|浏览(129)

我进行了以下测试,该测试在本地工作,但在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)
})

如何使这个函数通用?我尝试将toDatedate-fns-tz应用到isDST中的日期,但没有成功,我还尝试切换到parseISO

6vl6ewon

6vl6ewon1#

@deceze为什么你可能需要知道一个日期和时间字符串是否是夏令时。下面是一个德国日期(带时区信息):

    1. 2022年10月02:31欧洲/柏林
      UTC时间是几点?你不能说!因为夏令时在那个星期日结束。在30. Oktober 2022 02:59 CEST之后,你将有30. Oktober 2022 02:00 CEST作为下一个时间戳。也就是说,你可以有两个时间戳,只能通过夏令时标志来区分:
      1.欧洲中部时间2022年10月30日02:00
  1. 2022年10月30日02:00 CET...一小时后
    这就是你在挂钟上看到的内容。如果你不使用偏移信息,你就不能将时间戳正确地转换为UTC。这就是为什么你应该总是使用ISO 8601时间戳与偏移信息或正确的时区缩写的原因。只有这样你的日期才不会模糊。当你想打印的日期完全像在挂钟上一样时,你需要知道你的时间戳是否有DST。你打印时间戳,当它是DST时,你写CEST,否则你写CET。
    事实上,如果没有时区缩写,您就无法转换夏令时期间的任何时间戳,因为您不知道它是否是一个小时(CEST)或不是(CET)。

相关问题