来自ISO-8601:2004(E)规范:
4.2.2.4带小数部分的表示法
如果特定应用需要,可以包括小时,分钟或秒的小数部分.如果包含小数部分,则应省略低阶时间元素(如果有),小数部分应从整数部分除以ISO 31-0中指定的小数符号,即逗号[,]或句号[ ].其中,逗号是首选标志.
很简单.因此,根据此规范,优选使用逗号分隔整个和小数部分来写入一秒的分数,例如2014-01-01T00:00:00,123
.然而,似乎几乎无处不在,只接受小数点(又名"完全停止")!
现在我确定有一些语言或库将这一点考虑在内,我知道在很多情况下你可以自己提供格式的全部细节.但这似乎是对规范的明显监督,似乎各种程序员都犯了同样的错误. 除了纯粹的人为错误之外,是否存在这种情况的原因?
以下是我测试的地方列表.如果您找到其他人,请随意编辑问题以扩充我的列表.谢谢.
DateTime dt = DateTime.Parse("2014-01-01T00:00:00,123");
抛出一条FormatException
消息"字符串未被识别为有效的DateTime".使用句点而不是逗号的相同内容会成功解析.
最新(在撰写本文时)Chrome,Internet Explorer,Firefox和Node.js进行了测试:
var dt = new Date('2014-01-01T00:00:00,123');
退货"Invalid Date"
.使用句号代替工作正常.
var valid = moment("2014-01-01T00:00:00,123").isValid();
退货false
.使用句点代替返回true
.
echo strtotime('2014-01-01T00:00:00,123');
返回一个空字符串.使用句号代替工作正常.
require 'time'
puts Time.iso8601("2014-01-01T00:00:00,123")
给出了运行时错误.虽然Time
不保持小数秒,但它不应该出错 - 实际上如果使用句号,它就可以工作.
由IETF定义的RFC3339仅指定.
为分隔符.
这是第5.6节:
5.6. Internet Date/Time Format The following profile of ISO 8601 [ISO8601] dates SHOULD be used in new protocols on the Internet. This is specified using the syntax description notation defined in [ABNF]. date-fullyear = 4DIGIT date-month = 2DIGIT ; 01-12 date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on ; month/year time-hour = 2DIGIT ; 00-23 time-minute = 2DIGIT ; 00-59 time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second ; rules time-secfrac = "." 1*DIGIT time-numoffset = ("+" / "-") time-hour ":" time-minute time-offset = "Z" / time-numoffset partial-time = time-hour ":" time-minute ":" time-second [time-secfrac] full-date = date-fullyear "-" date-month "-" date-mday full-time = partial-time time-offset date-time = full-date "T" full-time