用momentJS正确对待DST转变

问题描述 投票:0回答:1

我发现了一些我认为是正确的东西,但现在仔细一看,显然有些东西是错误的。

我正在进行一个药丸提醒应用程序项目,人们可以设置通知来提醒他/她在正确的时间服药。有些药物可以让一个人终生服用。在这种情况下,我多年来没有设置警报,我最多设置 3 个月,当他拿走一个并将其标记为完成时,我会在 3 个月后从该日期/时间开始设置另一个警报。

此应用程序仅在巴西发布,我们这里有夏令时。当转入 DST 时间时,时钟必须调整为午夜后 -1 小时,当结束 DST 时间时,时钟会增加 1 小时。

对于这个项目,我使用 Firebase、Ionic 2、LocalNotification 插件和 Moment JS。

我必须为用户编写一个故事,因为其他用户可以看到他是否正确理解,因此我使用 Moment JS 来操作日期时间并保存通知,并使用 UNIX 时间在 firebase 中为该用户创建一个节点。

让我们终于解决问题。

保存日期时,我检查该日期是否为 DST,如果是,则添加 +3 小时,如果不是,则添加 +2。我需要添加这个,因为当我将 isoString 包装在

Moment()
函数中时,它会给我 -3 小时或 -2 小时(还没有搜索这个,但我认为 Moment 使用美国时间)。

如果我在 DST 时间内保存日期,如果我在 DST 时间,如果在某些情况下我不在 DST 并保存 DST 时间的通知,则它可以保存 +2 小时。

示例

DST 时间将在 10 月 15 日改为

in DST
。如果我需要保存 30 条通知,每天中午 12 点,从 10 月 1 日到 10 月 30 日。从第 1 天到第 15 天,日期将是正确的,从第 16 天到第 30 天,他们将多呆 2 小时。

这是我使用的基本代码:

// THIS'LL SET MY DATEPICKER TO THE DATE/HOUR I'M IN.
minDate: any = Moment().isDST ? Moment().subtract(3, 'h').toDate().toISOString() : Moment().subtract(2, 'h').toDate().toISOString();

// THIS'LL CONVERT THE SELECTED DATE TO A UNIX TIME IN WHICH I'LL USE TO SAVE THE NOTIFICATION AND THE MEDICATION DATA ON FIREBASE
unixConverted = Moment(this.minDate).isDST ? Moment(this.minDate).add(3, 'h').unix() : Moment(this.minDate).add(2, 'h').unix();

奇怪的是,单独使用

Moment().unix()
它会给我正确的时间,如果我使用
Moment(this.minDate).unix()
它会给我-2或-3小时我选择的时间。

因此,如果是 DST(我将时钟设置为 -1 小时),我会添加 3,如果不是,我会添加 2。

  • 那么如何正确地操纵夏令时转变呢?
  • 有比使用夏令时更好的方法吗?
  • 我使用这个逻辑是正确的还是这比我想象的要复杂得多?
javascript firebase ionic2 momentjs localnotification
1个回答
1
投票

好吧,我找到了一种更好的方法,而不使用

.isDST()
方法。

简单使用

Moment().add(Moment().utcOffset(), 'm')
,这将获取当前时刻时间并添加以分钟为单位的偏移量。

.add()
.subract()
方法使Moment返回UTC时间。

utcOffset()
返回 UTC 的正数或负数分钟(代表小时),例如 -60 或 180。所以我会得到正确的时移值。

对我来说就像一个魅力。

© www.soinside.com 2019 - 2024. All rights reserved.