json日期和时区

时间:2011-08-01 22:04:28

标签: javascript json datetime

我有以下代码:

$(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)/”是否包含时区信息,或者是警报中显示的时区是浏览器确定我的时区的结果?

感谢。

2 个答案:

答案 0 :(得分:2)

完全

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

某些框架(如ASP.Net)使用该语法来指示日期。他们所处的时区将由框架决定。我相信日期是UTC格式,因此您可以使用new Date(Number)构造函数创建它们(更多信息在this other answer)。这通过直接设置其内部“自纪元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则显示。 Here's a live example使用您的原始日期和日期(今天的日期,在我写这篇文章时),这是夏令时,所以即使在英国,您也可以看到UTC与当地时间之间的差异。


偏离主题:在JavaScript中,压倒性的惯例是使用以小写字母开头的camelCased名称作为局部变量和函数名称。所以,theDate而不是TheDate。初始大写字母保留给构造函数(如Date)。当然,你可以自由地忽略这个惯例,但它会让其他人难以阅读你的代码。

答案 1 :(得分:1)

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

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

但是,据我所知,除了UTC和本地系统时区之外,JavaScript中的时区之间无法转换。