我读过这个问题:如何将 JavaScript 日期转换为 UTC?
基于此,我在 dateTools 模块中实现了此转换,如下所示:
[更新]
var dt, utcTime;
dt = new Date();
utcTime = new Date(Date.UTC(dt.getFullYear(),
dt.getMonth(),
dt.getDate(),
dt.getHours(),
dt.getMinutes(),
dt.getSeconds(),
dt.getMilliseconds()));
现在我想编写单元测试。我的想法是检查结果是否真的是UTC,但我不知道怎么做。
所有toString,toUTCString和类似的方法对于输入(非UTC)和输出(UTC)日期似乎是相同的。
只有 getTime 方法的结果不同。
有没有办法在 javascript 中检查日期是 UTC?如果没有,有没有更好的主意来对此进行单元测试?
要提供更多上下文:
仅将其转换为 UTC 字符串并没有那么有用,因为在下一步中,日期将发送到 Asp.net 服务,因此转换为如下所示的字符串:
'/Date([time])/'
使用此代码
var aspDate = '/Date(' + date.getTime() + ')/';
var aspDate = '/Date(' + date.getTime() + ')/';
这将输出内部 UNIX epoch
值 (UTC),该值表示时间戳。您可以使用各种toString
方法来获取该时间戳的更详细的字符串表示形式:
-
.toString()
使用用户的时区,结果类似于"Fri Jan 25 2013 15:20:14 GMT+0100"
(至少对我来说,你可能住在不同的时区) -
.toUTCString()
使用 UTC,结果看起来像"Fri, 25 Jan 2013 14:20:15 GMT"
-
.toISOString()
使用 UTC,并根据 ISO:"2013-01-25T14:20:20.061Z"
设置日期字符串的格式
那么我们如何构建我们想要的时间价值呢?
-
new Date()
或Date.now()
生成当前日期时间。无论用户的时区是什么,时间戳都只是当前时刻。 -
new Date(year, month, …)
使用用户时区根据单个值构造时间戳。如果你希望这在你的用户社区中是相同的,你就完蛋了。即使不使用时间值而只使用日期,也可能导致奇怪的偏差错误。- 您可以使用
setYear
、setMonth
、...和getYear
,getMonth
...根据用户时区在现有日期上设置/获取单个值的方法。这适用于来自用户的输入/输出。 -
getTimezoneOffset()
允许您查询将用于所有这些的时区
- 您可以使用
-
new Date(timestring)
和Date.parse
是不可信的。如果您向他们提供没有明确时区表示的字符串,则 UA 可以随机操作。如果您想以正确的格式输入字符串,您将能够找到不接受它的浏览器(尤其是旧 IE)。 -
Date.UTC(year, month, …)
允许您根据 UTC 时区中的值构造时间戳。这对于 UTC 字符串的输入/输出非常方便。- 每个 get/set 方法都有一个 UTC 等效项,您也可以将其用于这些事情。
您现在可以看到,获取用户时区值并像使用 UTC 一样使用它们的方法一定是有缺陷的。这意味着dt
或utcTime
具有错误的值,尽管使用错误的输出方法可能会使其看起来正确。
-
获取时区偏移量
语法: object.getTimezoneOffset( ) 此方法返回本地时间和格林威治之间的分钟差平均时间。正如您可能认为的那样,此值不是常量,因为使用夏令时的做法。
即
var myDate = new Date;
var myUTCDate = new Date(myDate - myDate.getTimezoneOffset() * 60000);
alert(myUTCDate);
注意:60000是一分钟内的毫秒数;