在 JavaScript 中对日期输入进行单元测试处理,而不考虑时区

Unit testing handling of date inputs in JavaScript regardless of time zone

本文关键字:处理 单元测试 时区 不考虑 JavaScript 日期 输入      更新时间:2023-09-26

我有一个表单,用户可以在其中输入日期,即 <input type="date">yyyy-MM-dd格式提交值。当我使用字符串创建一个 Date 对象时,它假设时区是用户浏览器设置的时区——这就是我想要的行为。

然后,我使用日期值对需要 ISO 日期/时间字符串的 REST API 进行查询。这没有问题,因为 Date 对象上的 toISOString 函数可以正确处理所有内容。

但是,当我对此代码进行单元测试时 - 将我的输入设置为yyyy-MM-dd字符串,然后断言输出是预期的 ISO 时间戳字符串,测试只能在特定时区工作。有没有办法在测试中强制使用时区?

我试过使用茉莉花间谍做这样的事情:

var fixedTime = moment().zone(60).toDate()
spyOn(window, 'Date').andCallFake(function() {
    return fixedTime;
});

但是考虑到构造函数的变体太多了,并且按时刻调用的方式也太多了.js这是非常不切实际的,并且让我陷入了无限循环。

JavaScript Date不能设置为特定时区。 它只知道 UTC 和计算机的本地时间来自它正在运行的环境。

javascript有时区库,但我认为这对你没有帮助。

首先,了解"ISO"是指ISO8601,它是一个定义相关格式集合的规范,例如YYYY-MM-DDTHH:MM:SS

它是与UTC不同的概念,UTC指的是通用协调时间。 UTC 是我们所有人将时钟同步到的计时系统,它使用 GMT 作为其基础 - 即本初子午线的有效时间未针对夏令时进行调整。

总之,Date.toISOString() 方法将返回 UTC 格式的 ISO8601 格式时间戳,例如 2013-09-20T01:23:45Z 。 末尾的Z表示时间采用 UTC。

但是像 2013-09-20 这样的值仍然是 ISO 格式的 - 只是它只有一整天的精度,这意味着它不能携带任何时区信息。

使用 <input type="date"> 时,结果值不是Date类。 它是一个包含 ISO 格式YYYY-MM-DD的字符串。 您应该将其直接传递给您的应用程序。

现在,如果您要查找的是所选日期的完整日期和时间,即本地时区的午夜,并调整为 UTC,那就另当别论了。 这当然是可行的,但您必须了解,这与仅传递日历日期不同。

最简单的方法是使用 moment.js如下所示:

var s = "2013-09-20";  // from your input's value property
var m = moment(s);
var result = m.toISOString();  // "2013-09-20T07:00:00.000Z"

该值已调整,因为我的时区偏移量为 -07:00。

您可以无时使用 time,但您必须用斜杠替换破折号,否则原始值将被解释为已经采用 UTC。

new Date(s.replace('-','/')).toISOString()