Javascript SetMonth 问题

Javascript SetMonth Issue

我正在做单元测试。

  it("Month calculate", () => {
    const baseDate = new Date("2015-02-15T12:00:00.000Z");
    baseDate.setMonth(baseDate.getMonth() + 1)
    expect(baseDate.toISOString()).toBe("2015-03-15T12:00:00.000Z")
  })

在我的本地节点进程中出现此错误

Expected: "2015-03-15T12:00:00.000Z"
Received: "2015-03-15T13:00:00.000Z"

在 docker 节点进程上运行。

我认为它与夏令时有关,但我不明白怎么...

夏令时开始发挥作用是正确的,因为您使用的是 当地时间 setMonth/getMonth 方法,所以夏令时来了到其中(添加月份,Date 对象将 DST 考虑在内,以避免更改一天中的时间;但是当您查看 UTC 的结果时,您会看到时间因 DST 偏移而偏移,因为应用于增量的是当地时间数学)。要像其余代码一样在 UTC 中工作,请改用 setUTCMonth/getUTCMonth

it("Month calculate", () => {
    const baseDate = new Date("2015-02-15T12:00:00.000Z");
    baseDate.setUTCMonth(baseDate.getUTCMonth() + 1)
    expect(baseDate.toISOString()).toBe("2015-03-15T12:00:00.000Z")
})

可能您的 docker 节点在 UTC 工作,或者至少在当月 DST 不改变的时区(例如,在英国不改变;我们不改变)更改至 3 月下旬)。但在您当地的时区,显然 DST 发生在该月,因此您在本地看到问题,但在 docker 节点上看不到。