在 JavaScript 中对日期输入进行单元测试处理,而不考虑时区
Unit testing handling of date inputs in JavaScript regardless of time zone
我有一个表单,用户可以在其中输入日期,即 <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()
- 我的单元测试选项是什么
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 使用量角器的当前url单元测试的getTitle
- AngularJS指令单元测试中未定义的函数
- 如何在ember单元测试中模拟_super()方法
- 单元测试依赖关系没有被嘲笑
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 在node.js中编写单元测试的最佳方式是什么
- Ng点击-如何进行行为单元测试
- 为什么在单元测试中注入“ng”会改变承诺处理行为
- 是否应该对 JavaScript 事件处理程序进行单元测试
- 在 JavaScript 中对日期输入进行单元测试处理,而不考虑时区
- 如何处理单元测试用例的q和promise
- 在大型web应用程序中处理JavaScript(可重用性、捆绑、单元测试等)
- 错误:单元测试AngularJs服务时,没有待处理的flush请求
- 在IE中单元测试事件处理程序
- 在Angular单元测试中应该如何处理运行块?
- 如何处理单元测试中的嵌套异步操作
- Mocha单元测试错误处理库
- 在角度单元测试中处理帖子