JavaScript中日期输入的单元测试处理,不考虑时区
我有一个表单,用户可以在其中输入日期,即JavaScript中日期输入的单元测试处理,不考虑时区,javascript,unit-testing,jasmine,momentjs,Javascript,Unit Testing,Jasmine,Momentjs,我有一个表单,用户可以在其中输入日期,即该值以yyyy-MM-dd格式提交。当我使用字符串创建日期对象时,它假定时区是用户浏览器设置的时区–这是我想要的行为 然后,我将使用date值对一个需要ISO日期/时间字符串的RESTAPI进行查询。这没有问题,因为日期对象上的toISOString函数可以正确处理所有事情 但是,当我对该代码进行单元测试时–将输入设置为yyyy-MM-dd字符串,然后断言输出是预期的ISO时间戳字符串,测试只能在特定时区中工作。有没有办法在测试中强制时区 我试着用Jasm
该值以yyyy-MM-dd
格式提交。当我使用字符串创建日期对象时,它假定时区是用户浏览器设置的时区–这是我想要的行为
然后,我将使用date值对一个需要ISO日期/时间字符串的RESTAPI进行查询。这没有问题,因为日期对象上的toISOString
函数可以正确处理所有事情
但是,当我对该代码进行单元测试时–将输入设置为yyyy-MM-dd
字符串,然后断言输出是预期的ISO时间戳字符串,测试只能在特定时区中工作。有没有办法在测试中强制时区
我试着用Jasmine间谍做一些事情,比如:
var fixedTime = moment().zone(60).toDate()
spyOn(window, 'Date').andCallFake(function() {
return fixedTime;
});
但是,考虑到构造函数有如此多的变体,以及它被moment.js调用的方式如此之多,这是非常不切实际的,让我陷入无限循环。JavaScript
日期不能设置为特定时区。它只能从运行它的环境中了解UTC和计算机的本地时间
有,但我认为这对你没有帮助
首先,要理解“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格式的-只是它只有全天的精度,这意味着它不能携带任何时区信息
使用
时,结果值不是日期
类。它是一个包含ISO格式的YYYY-MM-DD
的字符串。您应该直接将其传递给您的应用程序
现在,如果您要查找的是所选日期的完整日期和时间,在当地时区的午夜,并调整为UTC,那么情况就不同了。这当然是可行的,但你必须明白,这并不等同于仅仅传递日历日期
最简单的方法如下:
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
您可以在没有时间限制的情况下执行此操作,但您必须用斜线替换破折号,否则原始值将被解释为UTC格式
new Date(s.replace('-','/')).toISOString()
为什么你不只是模仿mock moment.js?那我要测试什么呢?我的mock返回了我刚才告诉它的内容?我认为您不应该测试外部API是否按预期工作,而应该测试您的代码是否以正确的方式调用此API。我正在尝试测试我是否正确地将本地时区中的yyyy MM dd日期(用户的输入格式)转换为UTC ISO时间戳字符串(API的输入格式)。这是在测试我调用API的方式是否正确。今天学到了一些新东西。从不知道-
和/
被区别对待。