1

我一整天都在为此头疼。无论我如何初始化 Javascript 日期,我似乎都无法获得有效的日期对象......我假设日期是无效的,并且通过使用 Chrome 的调试器检查它不能正常工作,它的值是'__proto__:无效日期'。

我已经尝试了以下所有方法:

var d = new Date();
var d = new Date('2012-10-08');
var d = new Date('2012-10-08 00:00:00');
var d = new Date(Date('2012-10-08'));
var d = new Date(Date.parse('2012-10-08'));
var d = new Date(2012,10,08);
var d = new Date("October 13, 1975 11:13:00");

以及无数其他尝试。

这在 iOS 中出现了一个问题,我试图从这些 Date 对象中获取值,但每个函数都只返回 NaN。我宁愿避免使用外部库或必须将 YYYY-MM-DD 格式转换为任何其他格式,因为我试图让它与 HTML5 输入 type="date" 一起使用,并且移动代码最少地点。

本质上,这归结为:使 Date 对象有效的参数是什么?!

4

4 回答 4

4

不要相信 Date 对象来解析字符串,您必须手动进行。给定格式2012-10-08

function stringToDate(s) {
    s = s.match(/\d+/g);
    if (s) {
        return new Date(s[0], --s[1], s[2]);
    } 
}

您可能想要对输入字符串和生成的日期对象进行一些验证,上面只是显示了转换。

编辑

顺便说一句,似乎在所有浏览器中一致解析的唯一字符串格式是美国特定的month/date/year格式。没有规范支持它的使用,也没有任何理由相信浏览器会继续支持它,除了实用主义和“遗留”的原因。

对于绝大多数地区,“2/3/2012”被解释为 3 月 2 日,因此得到 2 月 3 日可能是意料之外的。

一旦旧版本的 IE 不再使用(可能几年后),按照 ECMA-262 使用 ISO8601 扩展格式应该是安全的。但是,即使支持它的浏览器也不一致。例如给定:

new Date('2011-02-29');

Firefox 15 返回“无效日期”,IE 9 和 Chrome 22 返回 2011 年 3 月 1 日的日期对象。

于 2012-10-09T22:59:02.347 回答
1

调用方法有以下三种方式:

  • 从纪元开始的毫秒数:

     new Date(milliseconds)
    
  • 任何符合 IETF 的 RFC 2822 时间戳

     new Date("November 2, 1988 10:00:00");
    
  • 个人参数:

     new Date(year, month, day [, hour, minute, second, millisecond])
     new Date(1988,11,02,10,0,0);  
    
于 2012-10-09T22:58:12.680 回答
1

如果您主要关心的是解析,请查看Moment.js,它显然优于自己解析事物。(恕我直言)

于 2012-10-09T23:19:24.577 回答
0

结果 jQuery 没有在 iOS 中正确地将 .change() 事件绑定到 input type="date" 。将事件更改为 .blur() ,现在一切似乎都正常了。但是,在 Chrome 中创建有效的日期对象似乎仍然是不可能的......另一天的问题。

感谢大家的帮助!

于 2012-10-10T15:59:31.120 回答