Javascript 为什么我的约会对象在我的Travis CI测试中要休息1小时

Javascript 为什么我的约会对象在我的Travis CI测试中要休息1小时,javascript,typescript,datetime,Javascript,Typescript,Datetime,我有一个函数,它返回一个由delta修改的日期对象,如下所示: 导出函数getDate(delta:string=”“,start?:Date):日期{ const date=start?新日期(start.getTime()):新日期(); const rel=delta.split(“”).join(“”); 常量[,符号,年,月,日,时,分,秒]=今天(/([+-])?(:(\d+)Y)?(:(\d+)M)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)M)?(?:(\d+)

我有一个函数,它返回一个由delta修改的日期对象,如下所示:

导出函数getDate(delta:string=”“,start?:Date):日期{
const date=start?新日期(start.getTime()):新日期();
const rel=delta.split(“”).join(“”);
常量[,符号,年,月,日,时,分,秒]=今天(/([+-])?(:(\d+)Y)?(:(\d+)M)?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)M)?(?:(\d+)s)?/.exec(rel)作为阵列状);
常数加号!=“-”;
如果(年)date.setFullYear(date.getFullYear()+(加上?+年:-年));
如果(月)date.setMonth(date.getMonth()+(加?+月:-月));
如果(天)date.setDate(date.getDate()+(加上?+天:-天));
如果(小时)date.setHours(date.getHours()+(加?+小时:-小时));
如果(分钟)date.setMinutes(date.getMinutes()+(加上?+mins:-mins));
如果(秒)date.setSeconds(date.getSeconds()+(加上?+secs:-secs));
返回日期;
}
它似乎在node和chrome中运行良好,我的测试在本地通过。但当我推进npm时,Travis CI中的测试失败,如下所示:

令人遗憾的是,我不知道为什么第一次考试在1小时内通过,第二次考试却失败了。有什么我错过的CET/UCT魔术吗?我是否错过了Date对象在不同节点版本中的工作方式

您可以在travis(上面的链接)中看到测试代码,但我也将在这里添加它:

const now=new Date();
让pos=Util.getDate(“+1Y2M3d4h5m6s”,现在);
期望(now.getTime()-pos.getTime()).toBe(-37166706000);//通过局部和travis
设neg=Util.getDate(“-1Y2M3d4h5m6s”,现在);
expect(now.getTime()-neg.getTime()).toBe(36903906000);//在本地通过,但在travis中失败

感谢您的智慧。

Travis CI系统运行在哪个时区?我的时区不识别DST,我得到的结果与Travis CI相同。由于您正在跨越时区边界(至少在美国,目前是4月,您要追溯到2月),因此根据时区是否识别DST,行为将有所不同。

Travis CI系统运行在哪个时区?我的时区不识别DST,我得到的结果与Travis CI相同。由于您正在跨越时区边界(至少在美国,目前是4月,您要追溯到2月),因此行为将根据时区是否识别DST而有所不同。

当您的输入为“现在”时,通过测试毫秒时间戳的差异,您假设所有单位始终具有相同的关联毫秒数。这是不正确的

  • 不是每年都有相同的天数。普通年份有365年。闰年有366个
  • 不是每个月都有相同的天数。从28岁到31岁不等
  • 并不是每一天都有24小时。时区偏移转换(例如由夏令时或标准时间的更改引起)可能导致给定的本地日的长度为23、23.5、24、24.5或25小时
由于您在当地时间工作,您将受到当地时区的影响。我假设您的一个环境在您正在测试的范围内有时区转换,而另一个没有


应用间隔的方法还存在一些其他问题。考虑输入日期为2019-01-31,间隔为代码> +1M1D < /代码>。您可能会期望它是2019-03-01,但是您的代码将给出2019-03-04,因为在应用每个步骤时会出现溢出。正确执行此操作的代码很复杂,通常会委托给诸如和之类的库。

当输入为“现在”时,通过测试毫秒时间戳的差异,可以假设所有单元始终具有相同的关联毫秒数。这是不正确的

  • 不是每年都有相同的天数。普通年份有365年。闰年有366个
  • 不是每个月都有相同的天数。从28岁到31岁不等
  • 并不是每一天都有24小时。时区偏移转换(例如由夏令时或标准时间的更改引起)可能导致给定的本地日的长度为23、23.5、24、24.5或25小时
由于您在当地时间工作,您将受到当地时区的影响。我假设您的一个环境在您正在测试的范围内有时区转换,而另一个没有


应用间隔的方法还存在一些其他问题。考虑输入日期为2019-01-31,间隔为代码> +1M1D < /代码>。您可能会期望它是2019-03-01,但是您的代码将给出2019-03-04,因为在应用每个步骤时会出现溢出。正确执行此操作的代码很复杂,通常会委托给库,如和。

非常好的答案,它帮助我找到了处理此问题的代码。但我建议不要延长日期。非常好的回答,它帮助我找到了处理它的代码。但我建议不要延长日期。是的,我以前用过,但只是需要一个简单的方法来计算不太精确的场景的日期,比如饼干生活等等,我不想再添加一个库。我想我有点天真,但我会试一试,因为在我的库中有这样一个功能很好。如果你打算自己实现,那么你应该在每个添加步骤后检查溢出,并相应地进行调整。您可能还想查看Luxon的
DateTime.plus(Duration)
,或者Date fns的
addYears
addMonths
addDays
,等等。无论哪种方式,您都不能以毫秒增量测试结果。您必须找到另一种方法,例如测试特定的输入,而不是“现在”,以及检查道具