我有以下代码:
$(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)/”是否包含时区信息,或者是警报中显示的时区是浏览器确定我的时区的结果?
感谢。
答案 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中的时区之间无法转换。