Javascript:将字符串解析为Date作为LOCAL时区

Sim*_*imo 28 javascript timestamp date

我有一个表示当前时间的字符串: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);
Run Code Online (Sandbox Code Playgroud)

Chrome将其用作UTC时间(Tue Nov 24 2015 11:40:00 GMT-0800 (Pacific Standard Time)),

但Firefox消耗它作为我当地的太平洋时间(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)将字符串解析为本地时区?

Rob*_*obG 39

强烈建议使用Date构造函数或Date.parse(基本上是相同的东西)解析日期字符串.

如果将Date作为函数调用并传递没有时区的ISO 8601格式日期字符串(例如2015-11-24T19:40:00),则可能会得到以下结果之一:

  1. 前ES5实现可以将其视为任何东西,甚至是NaN(例如IE 8)
  2. 符合ES5的实现将其视为UTC时区
  3. 符合ECMAScript 2015的实现将其视为本地(与ISO 8601一致)

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'));
Run Code Online (Sandbox Code Playgroud)

请注意,使用Date.parse解析ISO字符串只接受UTC,它不接受任何其他时区指定(如果缺少上述行为,请注意).


Joh*_*ren 5

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);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是它会自动应用正确数量的参数传递。如果这是您想要的。