在 DST 过渡期间增加几个小时

Posted

技术标签:

【中文标题】在 DST 过渡期间增加几个小时【英文标题】:Adding hours across the DST transition in moments 【发布时间】: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); 【参考方案1】:

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

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

【讨论】:

以上是关于在 DST 过渡期间增加几个小时的主要内容,如果未能解决你的问题,请参考以下文章

在 DateTime DST 重叠期间选择首选偏移量

计算 DST 转换边界处的持续时间(向前/后退的数量)

小米和OPPO等中国ROM的工作管理器,在电池优化时,将预定的工作延迟增加几个小时

C# - 处理 DST 过渡日的主要时间范围 - 提供的 DateTime 表示无效时间

在 Rails 中运行大量长时间运行的后台作业

在 SQL/数据库级别计算夏令时 (DST)