c# – 为什么当涉及到小数时,ISO-8601规范似乎被普遍忽略?

从ISO-8601:2004(E)规格:

4.2.2.4 Representations with decimal fraction

If necessary for a particular application a decimal fraction of hour,minute or second
may be included. If a decimal fraction is included,lower order time
elements (if any) shall be omitted and the decimal fraction shall be
divided from the integer part by the decimal sign specified in ISO
31-0,i.e. the comma [,] or full stop [.]. Of these,the comma is the
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.

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类似.请继续支持解析逗号.从欧洲的角度来看,很高兴看到并不是所有的东西看起来都像美国;-).

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...