至于时间部分,日期的部分也不能省略,而日期与时间部分回固定用一个T来分隔。时间的部分,从[秒]开始也是可以省略,不一定要完整的时间格式,而且时间格式最后的Z代表的是Time zone的意思,这个字段也是可以省略的。 例如以下时间格式都是合法的。 THH:mm THH:mm:ss THH:mm:ss.sss 如果把日期与时间组合在一起,就有非常多钟可能的变化,以下我举的几个例子,这些都是合法有效的日期格式字符串: new Date(‘2016T02:34’); new Date(‘2016-09T02:34:34’); new Date(‘2016-09-25T02:34:33’); new Date(‘2016-09T02:34:33.346’);
结论 “java 啊 java,枉费我跟你相处这么久,为什么你总是让人搞不懂啊”这句话不知道在多少web开发人员心中出现过,我的[前端工程研究]系列就是试图解决大家长久以来最搞不懂的坑。 请记得一件事,解析日期时间字符串格式时,在ES3规范中根本没有定义应该的日期时间字符串格式,到了ES5才有了明确的ISO-8601格式规范。 在那个没有明确定义日期时间字符串格式的ES3年代(IE6~8),当时各浏览器都职能各自实现自己的日期时间格式解析代码,因此跨浏览器之间的兼容问题自然会有。但当初毕竟浏览器都是美国人做的,所以用美国时间常见的日期时间格式来解析,肯定是没有问题的。比如:Sat, 24 Sep 2016 20:42:16 、 Sat, 24 Sep 2016 20:42:16 GMT 或 Sat, 24 Sep 2016 20:42:16 GMT+0800 等等。 而到了ES5规范问世之后(IE9+),因为必须向前兼容早起的实现,所以只要不是ISO-8601的日期格式出现,不同浏览器之间,还是会有可能出现不同的解析结果,像是safari对于2016-09-24 20:42:16这种格式就一直不支持的,你也不能说他错,他们就是遵照ES5规范去实现而已,所以大家也不用抱怨了,多一点包容与理解,世界才有可能更加祥和。 如果你的网站还是必须支持ie8或以下浏览器的话,因为ie8以下的java runtime并没有实现es5规范,所以当你的web api响应iso-8601日期格式,旧版ie浏览器还是无法解析,这个问题还是必须要考虑进去。 如果你要我给建议的话,我可以说兼容性最高的应该就是Sat, 24 Sep 2016 20:42:16 GMT这种日期时间格式,但请注意这种格式的缺点是[如果你没有加上GMT时区,浏览器预设酒会变这种格式解析为用户电脑的本地时间],如果没注意到时区部分,对于全球性或跨国浏览用户来说可能会出现错误的时间差,否则请一律使用ISO-8601标准日期时间格式( 2016-09T02:34:33.346Z ),这种格式的优点就是[浏览器只会将这种格式解析为GMT/UTC标准时区的时间],这样反而可以强迫你用具有时区的思维来开发代码,出现时差错误的问题也会减少。 下次大家在抱怨浏览器或框架之前,建议先查过java的权威文件,我心目中的java权威文件是java mdn网站,上面对java的介绍与说明一致都是最精华也是最完整的,大家可以多多利用。 补充说明 以下补充在写.NET/c#的DateTime格式时,方便转换成ISO-8601日期时间格式代码范例: var dt = new DateTime(2016, 9, 25, 17, 57, 43); Console.WriteLine(dt.ToUniversalTime().ToString(“s”)); // 2016-09-25T09:57:43 相关链接Date - Java | MDN 到底是 GMT+8 还是 UTC+8 ? - PanSci 泛科学 ECMA Language Specification - ECMA-262 Edition 5.1 - 15.9.1.15 Date Time String Format ECMA - Wikipedia, the free encyclopedia java - Safari JS cannot parse YYYY-MM-DD date format? - Stack Overflow Standard Date and Time Format Strings - MSDN (责任编辑:本港台直播) |