【问题标题】:JavaScript won't parse GMT Date/Time FormatJavaScript 不会解析 GMT 日期/时间格式
【发布时间】:2009-08-20 20:47:36
【问题描述】:

我正在尝试让 JavaScript 为我解析日期和时间格式,最终目的是告诉我自该日期以来经过的天数和现在(本地)的时间。

不幸的是,我必须使用的日期格式(它来自我无法控制的 JSON 响应)以 2008-10-01 06:21:43 类型格式返回。

var thedate = "2008-10-01 06:21:43";
var inmillisecs = new Date(thedate);

这只是从 JavaScript 返回一个错误,告诉我日期无效。

我该如何解决这个问题?

【问题讨论】:

  • 新日期的参数不应该是日期吗?

标签: javascript datetime date


【解决方案1】:

应该这样做

function dateFromUTC( dateAsString, ymdDelimiter )
{
  var pattern = new RegExp( "(\\d{4})" + ymdDelimiter + "(\\d{2})" + ymdDelimiter + "(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})" );
  var parts = dateAsString.match( pattern );

  return new Date( Date.UTC(
      parseInt( parts[1] )
    , parseInt( parts[2], 10 ) - 1
    , parseInt( parts[3], 10 )
    , parseInt( parts[4], 10 )
    , parseInt( parts[5], 10 )
    , parseInt( parts[6], 10 )
    , 0
  ));
}

alert( dateFromUTC( "2008-10-01 06:21:43", '-' ) );

【讨论】:

  • 谢谢...这是一个很好的开始!我想要本地(不是UTC)时间,所以我最终将parts[5] 行更改为:“ , parseInt(parts[5], 10 ) - new Date().getTimezoneOffset() ”。有一些警告,但我愿意和他们一起生活......见:stackoverflow.com/questions/2263705/…
【解决方案2】:

有个漂亮的库叫做DateJS。我没有这方面的经验,但你可能会发现它很有用。我想你会对parse() 和/或parseExact() 特别感兴趣。

我最初是从this SO post 听说的。

干杯。

编辑:我刚刚注意到你提到了时间,但我不确定 DateJS 是否处理时间,所以我将快速研究一下,否则你可以忽略这篇文章 :)

【讨论】:

  • DateJS 看起来不再被开发了(最后一次更新是在 2008 年)。相反,请尝试momentjs.com
【解决方案3】:

预期格式是美国格式:m/d/yyyy hh:mm:ss

var date1 = new Date("2008-10-01 06:21:43"); //fails
var date2 = new Date("10/1/2008 06:21:43"); //works correctly

【讨论】:

  • 感谢您澄清这个 Kip - 不幸的是,如上所述,我无法控制格式,因为它来自 API 通过 JSON。我想我唯一的选择是正则表达式替换所有内容,woopee。
  • @Jake:这个答案可能会对您有所帮助:stackoverflow.com/questions/1274743/…
  • 遗憾的是,不,规范甚至没有那么具体。它基本上说的是 new Date(string) 应该能够解析 someDate.toString() 吐出的任何内容,这取决于实现。 ecma-international.org/publications/standards/Ecma-262.htm
  • @Jake:是的,看起来这是您最好的选择,然后使用 Date 构造函数的长形式,该构造函数单独获取各个部分。不过,正则表达式还不错......
  • 规范,例如,确实说支持 RFC822 样式的日期格式“Mon, 25 Dec 1995 13:30:00 GMT”。这至少比没有时区的美式格式要好,尽管它仍然很糟糕。这种精神错乱是为什么通常最好尽可能将时间戳处理为整数(例如,在 Unix 风格的 seconds-since-epoch 中)。
【解决方案4】:

这是一个 ISO 9601 日期——它们是一个很好的标准。尝试使用正则表达式修改它:

(\d{4})-(\d{2})-(\d{2})[ tT](.*)

\2/\3/\1 \4

【讨论】:

    【解决方案5】:

    正确的语法应该是:

    var thedate = "2008 年 10 月 1 日 06:21:43"; var inmillisecs = new Date(thedate);

    您必须采取一些步骤将您收到的字符串转换为我显示的格式。使用美国格式也可以

    var thedate = "10/1/2008 06:21:42"; var inmillisecs = new Date(thedate);

    【讨论】:

      【解决方案6】:

      它必须是 parse() 函数可识别的字符串。

      http://www.devguru.com/technologies/javascript/10585.asp查看dateString参数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多