为什么ISO-8601规范在小数点时似乎被普遍忽略?

 围脖上的博博_771 发布于 2023-02-09 03:15

来自ISO-8601:2004(E)规范:

4.2.2.4带小数部分的表示法

如果特定应用需要,可以包括小时,分钟或秒的小数部分.如果包含小数部分,则应省略低阶时间元素(如果有),小数部分应从整数部分除以ISO 31-0中指定的小数符号,即逗号[,]或句号[ ].其中,逗号是首选标志.

很简单.因此,根据此规范,优选使用逗号分隔整个和小数部分来写入一秒的分数,例如2014-01-01T00:00:00,123.然而,似乎几乎无处不在,只接受小数点(又名"完全停止")!

现在我确定有一些语言或库将这一点考虑在内,我知道在很多情况下你可以自己提供格式的全部细节.但这似乎是对规范的明显监督,似乎各种程序员都犯了同样的错误. 除了纯粹的人为错误之外,是否存在这种情况的原因?

以下是我测试的地方列表.如果您找到其他人,请随意编辑问题以扩充我的列表.谢谢.

.NET/C#

DateTime dt = DateTime.Parse("2014-01-01T00:00:00,123");

抛出一条FormatException消息"字符串未被识别为有效的DateTime".使用句点而不是逗号的相同内容会成功解析.

JavaScript日期对象

最新(在撰写本文时)Chrome,Internet Explorer,Firefox和Node.js进行了测试:

var dt = new Date('2014-01-01T00:00:00,123');

退货"Invalid Date".使用句号代替工作正常.

带有moment.js的 JavaScript

var valid = moment("2014-01-01T00:00:00,123").isValid();

退货false.使用句点代替返回true.

PHP

echo strtotime('2014-01-01T00:00:00,123');

返回一个空字符串.使用句号代替工作正常.

红宝石

require 'time'
puts Time.iso8601("2014-01-01T00:00:00,123")

给出了运行时错误.虽然Time不保持小数秒,但它不应该出错 - 实际上如果使用句号,它就可以工作.

1 个回答
  • 由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
    

    2023-02-09 03:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有