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

前端之家收集整理的这篇文章主要介绍了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@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.

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

原文链接:https://www.f2er.com/csharp/95453.html

猜你在找的C#相关文章