c# – 为什么当涉及到小数时,ISO-8601规范似乎被普遍忽略?
从ISO-8601:2004(E)规格:
足够简单所以根据这个规范,一分秒的时间优先使用逗号分隔整数和十进制数,如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. PHP echo strtotime('2014-01-01T00:00:00,123'); 返回一个空字符串.使用期间可以正常工作. ruby require 'time' puts Time.iso8601("2014-01-01T00:00:00,123") 给出运行时错误.虽然时间不会保持分数秒,但它不应该是错误的 – 实际上如果使用了一段时间,它可以工作. 解决方法
纯ISO-8601兼容解析器必须支持逗号和点.逗号不是严格要求的,只能推荐使用.所以关于这个标准,JavaScript,PHP,Ruby等的给定例子清楚地表明了这些解析器实现的错误.
RFC3339确实只支持一个子集(不包括逗号,也不包括十进制小数或十进制分钟!) – 所以不完全符合ISO标准. XML模式是类似的.不幸的是,它不包括逗号(参见W3C文档). 所以你问为什么?这是我的怀疑:编程世界被美国强占主导.在美国文化中,点用作小数分隔符.因此,大多数开发框架,标准和图书馆的人都坐在美国,错误地认为点是准国际标准. 那么问题依然存在,为什么ISO使用/推荐了逗号?我不知道它,但我们都知道ISO集团的办公室位于巴黎,而不在美国.而在欧洲(不包括英国),逗号通常是小数分隔符,也是文化方面. 最后,并不是所有的解析器都是错误的.至少Joda-Time也支持逗号,虽然喜欢打印点. NodaTime的情况如何?我希望至少与Joda-Time类似.请继续支持解析逗号.从欧洲的角度来看,很高兴看到并不是所有的东西看起来都像美国;-). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |