【问题标题】:How to iterate through days and account for daylight savings time?如何遍历天数并考虑夏令时?
【发布时间】:2023-03-26 18:36:02
【问题描述】:

我有一个 mongoDB 脚本,我每天都在其中迭代并运行一些计算。我在 3 月 13 日左右遇到了一些意想不到的行为,我认为这是夏令时。我的代码如下所示:

var startDate = ISODate("2016-01-02T00:00:00Z")
var endDate = ISODate("2019-03-18T00:00:00Z")
while(startDate < endDate){
  print(startDate);
  startDate.setDate(startDate.getDate() + 1)
}

3 月 13 日之前的输出如预期:

ISODate("2016-03-11T00:00:00Z")
ISODate("2016-03-12T00:00:00Z")
ISODate("2016-03-13T00:00:00Z")
ISODate("2016-03-13T23:00:00Z")  <----- here
ISODate("2016-03-14T23:00:00Z")

我想同时拥有每个日期 (T00:00:00)。任何人都可以提出解决这个问题的方法吗?我应该考虑使用不同的方法来增加日期吗?

【问题讨论】:

  • 不确定,但如果你想有时间成为00:00:00,你可以试试date.setHours(0,0,0,0)
  • 如果我这样做,我想我会迭代 3/13/2016 两次
  • ST/DST 转换通常发生在 0200,而不是午夜,但您可能需要检查您的区域设置以确定。
  • 只是澄清一下,我的意思是,startDate.setHours(0,0,0,0); endDate.setHours(0,0,0,0)。不确定这是否会使它循环两次。

标签: javascript mongodb date


【解决方案1】:

您需要始终使用UTC,您可以使用Date.UTC 来做到这一点。打印数据时需要使用toISOString()

var startDate = Date.UTC(2016, 2, 10);
var endDate = Date.UTC(2016, 2, 30);
while (startDate < endDate) {
  document.write(new Date(startDate).toISOString()+'<br>');
  startDate = startDate +  86400000
}

【讨论】:

  • Jaco 的答案是正确的。但是要为此添加一些细节:如果您绝对需要时间为午夜,那么您需要将日期增加 25 小时,然后每次将时间设置回午夜。这是避免 sprint DST 转换的唯一方法。
  • 我使用getUTCDate()得到相同的结果
  • @Andrew 的建议是迄今为止唯一对我有用的东西。我不得不增加 25 小时,然后恢复到午夜。
  • 我已经更正了我的分析器,但是@Andrew 的建议现在你已经实现了它可能会更容易
  • Date.UTC(2016, 2, 10) 就足够了,因为缺少的参数被视为零(例如,您没有设置毫秒)。 ;-)
猜你喜欢
  • 2017-12-26
  • 2011-08-14
  • 2013-01-15
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2012-07-03
  • 2020-09-12
相关资源
最近更新 更多