用momentJS正确处理DST变换

时间:2017-05-19 18:39:46

标签: javascript firebase ionic2 momentjs localnotification

我遇到了一些我认为是正确的事情,但现在仔细看看有些事情是错误的。

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

此应用仅在巴西发布,我们在此处有夏令时。当它转换到DST时间时,必须将时钟调整到午夜后的-1小时,当它从DST开始时它会增加1小时。

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

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

让我们最终解决问题。

保存日期时,我会检查这个日期是否为DST,如果是,我会加上+3小时,如果不是,我会加上+2。我需要添加这个,因为当我在Moment()函数中包装isoString时,它给了我-3小时或-2小时(没有搜索过这个,但我认为Moment使用美国时间)。

如果我在DST时间内保存日期,如果我在DST时间,如果在某些情况下我没有使用DST并保存DST时间日期的通知,则保存时间为+2小时。 / p>

示例

夏令时的时间将在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 WICH 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小时。< / p>

所以如果它在DST中(我将时钟设置为-1小时)我加3,如果不是我加2。

  • 那么如何操纵这个DST转换的正确方法呢?
  • 有没有比使用DST更好的方法呢?
  • 我是正确使用这种逻辑还是比我想的要复杂得多?

感谢任何帮助,想法或指导。如果需要更多细节,请询问

1 个答案:

答案 0 :(得分:0)

好的,所以我没有使用.isDST()方法找到了更好的方法。

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

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

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

对我来说就像一个魅力。