【问题标题】:json dates and timezonesjson 日期和时区
【发布时间】:2011-08-01 22:04:28
【问题描述】:

我有以下代码:

$(function () {

    var thedate = "/Date(1198908717056)/";
    var thedate2 = ProcessDate(thedate)
    alert(thedate2);

});

function ProcessDate(DateString) {

    var TheDate = eval(DateString.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
    return TheDate;
}

运行时,它会返回 12 月 29 日的警报,时间显示为东部时间。 当我更改计算机上的时区时,它仍然显示东部时区的日期。

我的问题是:字符串“/Date(1198908717056)/”是否包含时区信息,还是警报中显示的时区是浏览器确定我的时区的结果?

谢谢。

【问题讨论】:

    标签: javascript json datetime


    【解决方案1】:

    JSON doesn't have dates 根本(这是 JSON 的缺陷之一)。这些字符串只是字符串。

    一些框架,如 ASP.Net,使用该语法来指示日期。他们所在的时区将由框架决定。我相信日期是 UTC 格式,所以你可以使用 new Date(Number) 构造函数来创建它们(更多信息在 this other answer 中)。这通过直接设置其内部“自 Epoch UTC 以来的毫秒数”值来创建日期,更多内容在规范的section 15.9 中。请注意,这仅在事实上创建这些伪日期字符串使用 UTC 时才有效。


    更新:查看您的代码,虽然它有效,但这一行:

    var TheDate = eval(DateString.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
    

    ...是对eval 的滥用。 eval 应尽可能避免。相反,如果您想将其保留为单行:

    var TheDate = new Date(Number(DateString.replace(/\/Date\((\d+)\)\//gi, "$1")));
    

    ...或者更具可读性:

    var Match = /\/Date\((\d+)\)\//gi.exec(DateString);
    var TheDate;
    if (Match) {
      TheDate = new Date(Number(Match[1]));
    }
    

    在所有这些情况下,Date 将使用嵌入在日期字符串中的 UTC 时间值进行初始化。但是,当您要求 JavaScript 格式化日期时(例如,通过toString),它将使用您的本地时区来执行此操作。你还没有展示你是如何输出日期的,所以我不能告诉你为什么如果你改变你的时区,时区似乎没有改变(也许浏览器没有接受改变?)。当我这样做时,如果我将日期输出为字符串,如果我使用toString,它会显示为英国夏令时(这是我当前的时区),如果我使用toUTCString,它会显示为UTC。 Here's a live example 使用您的原始日期和夏令时的日期(今天的日期,我写这篇文章时),所以即使在英国,您也可以看到 UTC 和当地时间之间的差异。


    题外话:在 JavaScript 中,压倒性的约定是对局部变量和函数名都使用以小写字母开头的驼峰式命名。所以,theDate 而不是TheDate。初始大写保留给构造函数(如Date)。当然,您可以随意忽略约定,但它往往会使其他人难以阅读您的代码。

    【讨论】:

    • 我在桌面上的文件系统中以纯 .html 格式运行页面,在整个 .net 框架之外,我仍然得到一个日期。是否行 var TheDate = eval(DateString.replace(/\/Date((\d+))\//gi, "new Date($1)"));使用纯 javascript 或是否存在 .net 依赖项;这很奇怪,因为我没有在 VS 或 IIS 中运行它。
    • 好的,太好了,感谢您的解释;很有道理。
    【解决方案2】:

    时区取自您当前的系统设置。看看Date 类。

    给定值以毫秒为单位,不包含时区。 Date() 的构造函数期望以 UTC 给出毫秒数。如果您的值具有已知时区,则应使用 dateString 构造函数版本。

    但是,据我所知,除了 UTC 和本地系统时区之外,没有办法在 JavaScript 中的时区之间进行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2011-06-11
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多