我有以下代码:
$(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)/"是否包含时区信息,或者警告中显示的时区是浏览器确定我的时区的结果?
谢谢。
JSON根本没有日期(这是JSON的缺陷之一)。那些字符串只是字符串。
一些框架,比如ASP。Net,使用该语法来指示日期。它们所在的时区将由框架决定。我相信日期是在UTC,所以你可以只使用new Date(Number)
构造函数来创建它们(更多在这个其他答案)。它通过直接设置其内部的"毫秒since the Epoch UTC"值来创建日期,详见规范的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显示日期。下面是一个使用原始日期和夏令时日期(我写这篇文章时是今天的日期)的实例,因此即使在英国,您也可以看到UTC和当地时间之间的差异。
离题:在JavaScript中,最普遍的习惯是以小写字母开头的骆驼大小写命名局部变量和函数名。所以是theDate
而不是TheDate
。初始大写是为构造函数(如Date
)保留的。当然,您可以自由地忽略这个约定,但它往往会使其他人难以阅读您的代码。
时区取自您当前的系统设置。看一下Date类。
给定的值以毫秒为单位,不包含时区。Date()的构造函数期望以UTC给出毫秒数。如果您的值具有已知的时区,则应该使用dateString
构造函数版本。
然而,据我所知,JavaScript中没有办法在时区之间进行转换,除了UTC和本地系统时区。