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

时间:2015-11-25 04:04:07

标签: javascript date timestamp

我有一个代表当前时间的字符串: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)将字符串解析为本地时区?

3 个答案:

答案 0 :(得分:37)

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

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

  1. 预先ES5实现可以将其视为任何内容,甚至是NaN(例如IE 8)
  2. 符合ES5的实施将其视为UTC时区
  3. ECMAScript 2015兼容实现将其视为本地(与ISO 8601一致)
  4. 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中编译。 编号