4.2.2.4 Representations with decimal fraction
If necessary for a particular application a decimal fraction of hour,minute or second@H_502_8@ may be included. If a decimal fraction is included,lower order time@H_502_8@ elements (if any) shall be omitted and the decimal fraction shall be@H_502_8@ divided from the integer part by the decimal sign specified in ISO@H_502_8@ 31-0,i.e. the comma [,] or full stop [.]. Of these,the comma is the@H_502_8@ preferred sign.
足够简单所以根据这个规范,一分秒的时间优先使用逗号分隔整数和十进制数,如2014-01-01T00:00:00,123.然而,似乎到处都是,只有一个小数点(又名“全停”)被接受!
现在我确信有一些语言或图书馆考虑到这一点,我知道在许多情况下,您可以提供自己的格式的全部细节.但是,对于这个规范来说,这样的监督看起来似乎是各种各样的程序员犯了同样的错误.有没有理由为什么会这样,除纯粹的人为错误?
以下是我测试的地方的列表.如有任何其他问题,请随时编辑问题以增加我的清单.谢谢.
.NET / C#
DateTime dt = DateTime.Parse("2014-01-01T00:00:00,123");
使用消息“String被识别为有效的DateTime”抛出一个FormatException.同一件事情,而不是一个逗号分析成功.
JavaScript日期对象
测试了最新的(在撰写本文)Chrome,Internet Explorer,Firefox和Node.js:
var dt = new Date('2014-01-01T00:00:00,123');
返回“无效日期”.使用期间可以正常工作.
JavaScript与moment.js
var valid = moment("2014-01-01T00:00:00,123").isValid();
返回false.使用期间代替返回true.
echo strtotime('2014-01-01T00:00:00,123');
返回一个空字符串.使用期间可以正常工作.
ruby
require 'time' puts Time.iso8601("2014-01-01T00:00:00,123")
解决方法
RFC3339确实只支持一个子集(不包括逗号,也不包括十进制小数或十进制分钟!) – 所以不完全符合ISO标准.
XML模式是类似的.不幸的是,它不包括逗号(参见W3C文档).
所以你问为什么?这是我的怀疑:编程世界被美国强占主导.在美国文化中,点用作小数分隔符.因此,大多数开发框架,标准和图书馆的人都坐在美国,错误地认为点是准国际标准.
那么问题依然存在,为什么ISO使用/推荐了逗号?我不知道它,但我们都知道ISO集团的办公室位于巴黎,而不在美国.而在欧洲(不包括英国),逗号通常是小数分隔符,也是文化方面.
最后,并不是所有的解析器都是错误的.至少Joda-Time也支持逗号,虽然喜欢打印点. NodaTime的情况如何?我希望至少与Joda-Time类似.请继续支持解析逗号.从欧洲的角度来看,很高兴看到并不是所有的东西看起来都像美国;-).