我有一个代表当前时间的字符串:2015-11-24T19:40:00
。如何在Javascript中解析此字符串以将此字符串表示的日期作为 LOCAL TIME ? 由于某些限制,我无法使用库moment
,但允许使用jquery。我知道之前有人问过这个问题,但回答是moment
例如,如果我在加利福尼亚运行脚本,那么此字符串将代表太平洋时间的7PM,但如果我在纽约运行该脚本,那么此字符串将代表东部时间?
我尝试了以下内容,但Chrome和Firefox给了我不同的结果:
var str = "2015-11-24T19:40:00";
var date = new Date(str);
Chrome会将其消耗为 UTC 时间(Tue Nov 24 2015 11:40:00 GMT-0800 (Pacific Standard Time)
),
但Firefox将其作为我当地的 PACIFIC 时间(Tue Nov 24 2015 19:40:00 GMT-0800 (Pacific Standard Time)
)
我尝试将“Z”添加到str
,就像这个var date = new Date(str+"Z");
一样,然后两个浏览器都给我UTC时间。是否有任何类似的信件"Z"
告诉所有浏览器(至少是chrome,Firefox和Safari)将字符串解析为本地时区?
答案 0 :(得分:37)
强烈建议使用Date构造函数或Date.parse(基本上是相同的东西)解析日期字符串。
如果将Date作为函数调用并传递没有时区的ISO 8601格式日期字符串(例如2015-11-24T19:40:00),则可能会得到以下结果之一:
Date对象具有UTC的时间值和基于系统设置的偏移量。当您发送日期输出时,您看到的通常是 Date.prototype.toString 的结果,它是一个依赖于实现的,人类可读的字符串,表示日期和时间,通常在基于时间的时区系统设置。
解析日期字符串的最佳方法是手动执行。如果您确信格式是一致且有效的,那么将ISO格式字符串解析为本地日期就像这样简单:
/* @param {string} s - an ISO 8001 format date and time string
** with all components, e.g. 2015-11-24T19:40:00
** @returns {Date} - Date instance from parsing the string. May be NaN.
*/
function parseISOLocal(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1]-1, b[2], b[3], b[4], b[5]);
}
document.write(parseISOLocal('2015-11-24T19:40:00'));
请注意,使用Date.parse解析ISO字符串只接受UTC,它不接受任何其他时区指定(如果缺少上述行为,请注意)。
答案 1 :(得分:4)
RobG极好的答案的变化。
注意这将要求您运行最前沿的JavaScript 它依赖于箭头符号和传播运算符。
function parseDateISOString(s) {
let ds = s.split(/\D/).map(s => parseInt(s));
ds[1] = ds[1] - 1; // adjust month
return new Date(...ds);
}
这种方法的好处是它会自动应用传递的正确数量的参数。如果这是你想要的。
答案 2 :(得分:-1)
如果将Date作为具有多个参数的构造函数调用,则指定的参数表示本地时间。
我也比使用string.split()快得多,因为我们已经知道数字在哪里:
return new Date(Number(date.substring(0, 4)), Number(date.substring(5, 7))-1,
Number(date.substring(8, 10)), Number(date.substring(11, 13)),
Number(date.substring(14, 16)), Number(date.substring(17, 19)));
这将使用和/或不使用'T'和'Z'字符串,并且仍然具有不错的性能。我添加了显式的Number转换(比parseInt更快更好)所以这也在TypeScript中编译。 编号