如何在Javascript中检查日期是否为UTC?

时间:2013-01-25 13:34:40

标签: javascript datetime

我读过这个问题: How do you convert a JavaScript date to 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,但我不知道如何。

输入(非UTC)和输出(UTC)日期的所有toString,toUTCString和类似方法似乎相同。

只有getTime方法的结果不同。

有没有办法在javascript中检查日期是UTC?如果没有,是否有更好的想法进行单元测试?

提供更多背景信息:

只将它转换为UTC字符串没有用,因为在下一步中,日期会被发送到Asp.net服务,因此转换为如下字符串:

'/Date([time])/'

使用此代码

var aspDate = '/Date(' + date.getTime() + ')/';

2 个答案:

答案 0 :(得分:9)

var aspDate = '/Date(' + date.getTime() + ')/';

This输出内部UNIX epoch value (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, …)使用用户时区从单个值构建时间戳。如果您希望在您的用户社区中使用它,那么您就会被搞砸了。即使不使用时间值,但只有日期,它可以导致odd off-by-one errors
    • 您可以使用setYearsetMonth,...和getYeargetMonth ...方法根据用户时区在现有日期设置/获取单个值。这适用于从/输出到用户的输入。
    • getTimezoneOffset()允许您查询将用于所有这些
    • 的时区
  • new Date(timestring)Date.parse无法信任。如果您为它们提供没有明确时区表示的字符串,则UA可以随机操作。如果你想用适当的格式提供一个字符串,你将能够找到一个不接受它的浏览器(特别是旧的IE)。
  • Date.UTC(year, month, …)允许您根据UTC时区中的值构造时间戳。这对于UTC字符串的输入/输出非常方便。
    • 每个get / set方法都有一个UTC等价物,你也可以用它来做这些事情。

您现在可以看到,获取用户时区值并将其用作UTC格式的方法必定存在缺陷。这意味着dtutcTime具有错误的值,但使用错误的输出方法可能会使其显示正确。

答案 1 :(得分:0)

  • 使用getTimezoneOffset

    语法:object.getTimezoneOffset()此方法 返回当地时间和格林威治之间的分钟差异 与此同时。正如您所想,这个值不是常数,因为 使用夏令时的做法。

var myDate = new Date;
var myUTCDate = new Date(myDate - myDate.getTimezoneOffset() * 60000);
alert(myUTCDate);

注意:60000是一分钟内的毫秒数;