我遇到了一些我认为是对的,但现在仔细看看有些东西显然是错误的。
我正在开发一个药丸提醒应用程序的项目,有人可以设置通知以提醒他/她在正确的时间服用药丸。有些人可以在余生中服用药物。在这种情况下,我多年不设置警报,我最多设置 3 个月,当他拿一个并将其标记为完成时,我会在 3 个月后从该日期/时间开始设置另一个警报。
此应用程序将仅在巴西发布,我们在这里有夏令时。当它切换到 DST 时间时,时钟必须在午夜后调整为 -1 小时,当关闭 DST 时,它会增加 1 小时。
对于这个项目,我使用的是Firebase,Ionic 2,LocalNotification Plugin和Moment JS。
我必须为用户制作一个故事,因为其他用户可以看到他是否正确获取了它,所以我使用 Moment JS 来操作日期时间并保存通知,并使用 UNIX 时间在 firebase 中为该用户创建一个节点。
让我们最后进入问题。
保存日期时,我检查此日期是否为 DST,如果是,我为其添加 +3 小时,如果不是,我添加 +2。我需要添加这个,因为当我将 isoString 包装在Moment()
函数中时,它会给我 -3 小时或 -2 小时(没有搜索过这个,但我认为 Moment 使用美国时间)。
如果我在 DST 时间内保存日期,如果我在 DST 时间内保存日期,如果在某些情况下我不在 DST 上并为 DST 时间日保存通知,则它节省了 +2 小时,这工作正常。
一个例子
夏令时时间将于 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 小时。
因此,如果它是在 DST 中(我将时钟设置为 -1 小时),我会加 3,如果不是,我会加 2。
- 那么,操纵这种DST转变的正确方法是什么?
- 有没有比使用 DST 更好的方法? 我
- 使用这个逻辑是对的,还是比我想象的要复杂得多?
好的,所以我找到了一种更好的方法,而无需使用.isDST()
方法。
简单使用Moment().add(Moment().utcOffset(), 'm')
,这将获取当前时刻时间并以分钟为单位添加偏移量。
.add()
和.subract()
方法使 Moment 返回 UTC 时间。
utcOffset()
从 UTC 返回正数或负数分钟数(表示小时),例如 -60 或 180。所以我会得到正确的时间转移。
对我来说就像一个魅力。