MomentJS 和 JS Date 对象不引用同一小时



我有一个服务器实例(NodeJS(,它接收一组对象,并安排它们向用户发送推送通知。

其中一些对象是周期性的,这种周期性由如下所示的字符串处理:

90=>Mon&Tue&Thu=>16:00

读作:

offset_minutes=>days_of_the_week=>initial_hour

然后,我要做的是检查当前日期是否与字符串中的给定日期之一匹配,然后在"initial_hour"中将日期修改为给定小时,最后,从 Date 对象中减去"offset_minutes"分钟数。

直到现在似乎很简单,对吧?嗯,没那么多。让我们先看一下代码:

const isToday = weekDays.split("&")
.map(a => {
switch (a) {
case 'Mon': return 1;
case 'Tue': return 2;
case 'Wed': return 3;
case 'Thu': return 4;
case 'Fri': return 5;
case 'Sat': return 6;
case 'Sun': return 7;
}
})
.some(v => v == currentDay);
if (isToday) {
let finalDate = moment(today)
.set("hour", Number(hour))
.set("minute", Number(mins));

if (offset) {
finalDate.subtract('minutes', Number(offset));
}

return finalDate.toDate();

一切都运行良好,直到我进行 MomentJS 转换。当我使用".toDate(("方法输出日期对象时,此对象始终设置为预期时间前 2 小时。但是如果我使用 .toISOString(( 方法,我会得到所有八项的适当时间。

我猜我的 Date 对象有问题,将它们设置在与我拥有的时区不同的时区。举几个例子:

  • 对于字符串90=>Mon&Tue&Thu=>16:00我得到日期对象:2019-10-14T14:00:11.852Z
  • 对于字符串30=>Mon&Tue&Wed&Thu&Fri&Sat&Sun=>18:30我得到日期对象:2019-10-14T16:30:11.866Z

我想知道这种行为的解释是什么,以及我是否可以做一些事情来改变它,以便正常的 Javascript Date 对象指向与我的 momentjs 对象或 .toISOString(( 输出相同的小时。

谢谢!

发布的代码不完整,未演示所描述的问题。

我已经尽我所能地重新实现了代码.js并简化了它。它似乎工作正常:

function parseThing(s) {
// Parse input string
let b = s.split('=>');
let offset = +b[0];
let days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
let weekDays = b[1].split('&').map(day => days.indexOf(day));
let [hr, min] = b[2].split(':');
// Get a date for today
let date = new Date();
// If today included, return an adjusted date
if (weekDays.includes(date.getDay())) {
date.setHours(hr, min, 0, 0);
if (offset) {
date.setMinutes(date.getMinutes()+ Number(offset));
}
return date;
}
// If today isn't included, return null
return null;
}
let s0 = '90=>Mon&Tue&Thu=>16:00';
let s1 = '0=>Mon&Tue&Wed&Thu&Fri&Sat&Sun=>18:30';
console.log(parseThing(s0).toString());
console.log(parseThing(s1).toString());

如果本地日期是字符串(星期一、星期二、星期四(中的一个,则返回一个 Date 等效于本地时间 17:30,与 16:00 偏移量为 90 分钟,这似乎是正确的。

PS 我已将星期日更改为 0,因为我看不出它为 7 的任何理由。秒和毫秒也归零。

最新更新