【问题标题】:Adding hours across the DST transition in moments在 DST 过渡期间增加几个小时
【发布时间】:2019-10-14 21:16:25
【问题描述】:

我正在尝试使用 d3 创建一个图表,该图表在每个上午 0 点、上午 6 点、中午和下午 6 点都有一条垂直网格线(偏离 X 轴)。我通过手动计算 momentjs 中的刻度值来做到这一点。我很容易用

计算一天的开始
 firstPoint = momenttz(startDate).startOf('day')

然后循环加6小时。

for (let i = 0; i <= days * 24; i += 6) {
    hourTickValues.push(firstPoint.clone().add(i, 'hours'));
}

在进入或退出夏令时时,我希望将线路保持在当地时间早上 6 点、中午和下午 6 点。这将意味着一年两次的网格间距会有所不同,因为在凌晨 12 点到早上 6 点之间只有 5 小时进入 DST,而离开时只有 7 小时。

Momentjs 的docs 明确指出,将小时 添加到时间时,它不会针对夏令时进行调整,但添加 时会调整。我还发现添加小数天数不起作用,它总是四舍五入为整数。

那么,如何根据 DST 调整时钟可靠地为每 6 小时创建一个 (momentjs) 日期对象?

【问题讨论】:

  • 您是否尝试过使用持续时间?您链接的文档指出:或者,您可以使用 durations 添加到时刻,因此您可能会有类似:hourTickValues.push(firstPoint.clone().add(moment.duration({hours: i}));
  • 我没有,因为在提出问题的几分钟内,我已经通过手动将每个项目投射到第 6 小时来解决它hourTickValues[everyhourTickValues.length - 1].hours(i % 24);

标签: momentjs dst


【解决方案1】:

我通过在创建后一小时手动设置每个时间对象来解决这个问题。

for (let i = 0; i <= days * 24; i += 6) {
    hourTickValues.push(firstPoint.clone().add(i, 'hours'));
    hourTickValues[hourTickValues length - 1].hours(i % 24);
}

【讨论】: