【问题标题】:Add a day via date-fns considering time zone change考虑到时区变化,通过 date-fns 添加一天
【发布时间】:2019-08-28 23:39:35
【问题描述】:

在我的项目中,我使用 date-fns 进行日期操作。需要在某个范围内迭代天数。为此,我使用以下代码:

  for (
    // from and to are always start of some day, from <= to
    let date = from;
    isBefore(date, to) || isEqual(date, to);
    date = addDays(date, 1)
  ) {
    // Some operations with date
  }

我希望date 始终是某一天的开始,但如果时区发生变化(冬季时间 -> 夏季时间),日期会比预期时间少 1 小时。这是一个例子:

const from = new Date('2019-03-31T00:00:00.000Z')
const fromPlusDay = dateFns.addDays(from, 1)

// I'm getting "2019-03-31T23:00:00.000Z"
// instead of "2019-04-01T00:00:00.000Z"
fromPlusDay.toISOString()

顺便说一句,我的时区是 +2,而在移到夏季时间后,它变成了 +3

【问题讨论】:

  • UTC 没有夏令时,也不是时区。当您使用本地方法添加一天并跨越夏令时边界时,时区会发生变化,UTC 偏移也会发生变化,因此您会看到 UTC 时间戳的小时(可能还有分钟)的差异。

标签: javascript date date-fns


【解决方案1】:

正在考虑您的时区变化,并且它i在一天的开始(在您的时区,而不是 UTC)。 UTC 的午夜不一定是您所在地区一天的开始。

检查一下(我在 GMT+1 区域):

const from = dateFns.parse('2019-03-31') // -> "2019-03-31T00:00:00.000+0100"
const fromPlusDay = dateFns.addDays(from, 1)

dateFns.format(fromPlusDay , 'YYYY-MM-DDTHH:mm:ss.SSSZZ') // -> "2019-04-01T00:00:00.000+0200"

我认为您所做的很好,只是不要期望您的区域在 UTC 中是 00:00,并避免在 UTC 中打印日期。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题:

    2019 年 10 月 6 日在澳大利亚是夏令时开始。

    dh.parse('2019-10-06')
    

    返回:2019 年 10 月 5 日星期六 23:00:00 GMT+1000(澳大利亚东部标准时间)

    解决方案是添加有关时区的信息(其中之一):

    1. 添加缺席时区偏移符号“Z” -- dh.parse('2019-10-06T00:00:00.000Z' )
    2. 添加 GMT -- dh.parse('2019-10-06 GMT' )
    3. 添加 +00:00 -- dh.parse('2019-10-06T00:00:00.000+00:00' )

    ]1)

    【讨论】:

      猜你喜欢
      • 2014-01-16
      • 2019-02-03
      • 1970-01-01
      • 2021-08-11
      • 2013-01-15
      • 2017-12-26
      • 2016-10-22
      • 2021-11-08
      • 2021-08-01
      相关资源
      最近更新 更多