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高级教程JavaScript Date(日期) 对象