Javascript Date(dateString) 在特定服务器和浏览器上返回 NaN

Posted

技术标签:

【中文标题】Javascript Date(dateString) 在特定服务器和浏览器上返回 NaN【英文标题】:Javascript Date(dateString) returns NaN on specific server and browser 【发布时间】:2011-11-11 19:31:32 【问题描述】:

我正在使用日期格式为“yyyy-mm-dd”的 javascript Date(string) 构造函数。构造函数在 IE 9 和 Firefox 中运行良好,除非应用程序在运行 IIS 的测试 VM 上运行。如果它在 VM 上,在 IE 9 中它会返回“NaN”,但在 Firefox 中仍然可以正常工作。

    var dateAsString = "2011-11-09";
    var dateCreated = new Date(dateAsString);

我假设服务器与客户端 Javascript 无关。有什么建议吗?

【问题讨论】:

很确定服务器与客户端 Javascript 无关,因为客户端(访问网站的人)运行该代码,而不是服务器。 @jakx 我知道,这就是我对此感到困惑的原因。 在两台服务器的IE(F12)的开发者工具中查看文档模式。我怀疑它们不同。 @Phrogz 获胜!谢谢。现在我今晚可以睡觉了! 【参考方案1】:

对于我们这些想知道如何用斜线替换连字符(又名破折号)的人:

new Date(dashToSlash(string));

使用这个函数:

function dashToSlash(string)
  var response = string.replace(/-/g,"/");
  //The slash-g bit says: do this more than once
  return response;

在我的情况下,选择性地将连字符转换为斜杠(仅在 Date() 函数需要的地方)比在我的代码中随处替换日期格式要容易得多。

注意:您确实需要定义一个单独的“响应”变量并将替换操作结果的值分配给它。如果您不这样做,该字符串将在 Chrome 中原封不动地返回。这不是一个大问题,因为 Chrome 开始时不存在带连字符的日期字符串的问题。不过还是……

【讨论】:

you really need to define a separate 'response' variable and assign it the value of the replace operation result. If you don't, the string is returned unaltered in Chrome. 什么?【参考方案2】:

如果可以,请使用斜杠而不是连字符。


编辑:扩展说明...

ISO 8601 标准格式使用连字符作为日期分隔符。我的回答并不意味着你不需要遵循标准。如有必要,您可以仅对 Date 构造函数使用斜杠。

【讨论】:

这听起来确实很吸引人。您能否确认所有其他主流浏览器也支持斜杠分隔格式? 像魅力一样工作! :-)【参考方案3】:

这是因为日期格式。出于某种原因,IE 和 Safari 被yyyy-mm-dd 绊倒了。使用另一种日期格式,您应该已准备就绪。

这里谈到了:http://biostall.com/javascript-new-date-returning-nan-in-ie-or-invalid-date-in-safari

【讨论】:

但是,真正的问题是,当我在本地主机(Visual Studio 服务器)上运行应用程序时,它确实可以在 IE 中工作。当它在不同的服务器上时,它在 IE 中不起作用。 其他服务器是否安装了不同版本的IE? 不,在同一个 IE 9 中打开了两个不同的选项卡。相同的 JS 代码,不同的行为。 @Gagege:你是用localhost还是有更真实的域名,例如dev.example.com。 IE 的行为可能会有所不同,具体取决于它与站点关联的区域(受信任/Intranet/Internet/不受信任/我的电脑)。 @LeeKowalkowski 这很有道理,但事实证明 IE9 中的“文档模式”在其中一台服务器上设置为 IE7。【参考方案4】:

我建议尝试一种更可靠的日期解析形式。下面的示例使用setFullYear()。 IE使用下面的代码会产生不同的结果吗?

/**Parses string formatted as YYYY-MM-DD to a Date object.
   * If the supplied string does not match the format, an 
   * invalid Date (value NaN) is returned.
   * @param string dateStringInRange format YYYY-MM-DD, with year in
   * range of 0000-9999, inclusive.
   * @return Date Date object representing the string.
   */
  function parseISO8601(dateStringInRange) 
    var isoExp = /^\s*(\d4)-(\d\d)-(\d\d)\s*$/,
        date = new Date(NaN), month,
        parts = isoExp.exec(dateStringInRange);

    if(parts) 
      month = +parts[2];
      date.setFullYear(parts[1], month - 1, parts[3]);
      if(month != date.getMonth() + 1) 
        date.setTime(NaN);
      
    
    return date;
  

来源:http://jibbering.com/faq/#parseDate

【讨论】:

那行得通。但这仍然让我感到困惑。提供 JS 的服务器应该不重要吧?当我在 localhost 上运行代码时,我的代码在 IE 中运行。 我有一个日期,其中还包括时间和区域(只需要日期)。我在第 2 行编辑了您的正则表达式,并从中删除了 ^ 和 $。否则,工作就像一个魅力。

以上是关于Javascript Date(dateString) 在特定服务器和浏览器上返回 NaN的主要内容,如果未能解决你的问题,请参考以下文章

date.setTime (Date) – JavaScript 中文开发手册

JavaScript—Date对象详情

javascript高级教程JavaScript Date(日期) 对象

JavaScript:Date类型

javascript高级教程JavaScript Date(日期) 对象

JavaScript Date对象和函数