【发布时间】:2014-11-21 09:53:36
【问题描述】:
应该如何使用 ISO 8601 表示 500 毫秒的持续时间?对我来说,documentation 并不是 100% 清楚的。只是“PT0.5S”吗?
【问题讨论】:
-
我无法回答,但我同意你的解释。维基百科是现成的最好的“文档”,这太糟糕了,因为必须从 ISO 购买完整的规范才能给出答案。
-
我经常认为让人们为标准文档付费并不能很好地推广标准。
应该如何使用 ISO 8601 表示 500 毫秒的持续时间?对我来说,documentation 并不是 100% 清楚的。只是“PT0.5S”吗?
【问题讨论】:
只是“PT0.5S”吗?
是的,这是正确的表示。
java.time.Duration 以ISO-8601 standards 为蓝本,并作为JSR-310 implementation 的一部分引入。
演示:
import java.time.Duration;
public class Main {
public static void main(String[] args) {
System.out.println(Duration.ofMillis(500));
}
}
输出:
PT0.5S
从 Trail: Date Time 了解现代日期时间 API。
【讨论】:
是的。
我只能找到 8601 的旧草稿,但它在分数表示上是明确的:
5.5 时间段
5.5.1 指定时间段的方法
时间段应以下列方式之一表示:
a) 作为由特定开始和特定结束分隔的持续时间;
b) 以一个或多个特定组件表示但不相关的持续时间 有任何特定的开始或结束;
c) 作为与特定开始相关的持续时间;
d) 作为与特定结束相关的持续时间。
5.5.2 分隔符和指示符
在 5.5.1 a)、c) 和 d) 中,应使用固线 [/] 分隔两个组件。
对于 5.5.1 b)、c) 和 d),指示符 [P] 应在持续时间表示之前,不带空格。
应使用其他指示符(以及用于表示省略组件时的连字符),如 5.5.4和5.5.5以下。
以后
5.5.3.1 带有时间单位指示符的格式
在 时间段或重复时间间隔持续时间的表达式可以由以下数据元素表示 可变长度。年数后跟代号 [Y],月数 [M],周数 [W],天数 [D]。那个部分 包括时间成分应以代号 [T] 开头;应遵循小时数 [H],分钟数 [M],秒数 [S]。在示例中 [n] 代表一个或多个数字,构成一个正整数或零。
在完整表示中,格式应为 nYnMnDTnHnMnS 或 nW。
对于这种持续时间格式的降低精度、小数或截断表示,请遵循以下规则 申请:
a) 如果对特定应用有必要,可以省略最低阶组件来表示 精度降低的持续时间;
b) 如果特定应用需要,最低阶组件可能有小数部分。这 小数部分应从整数部分除以 ISO 31-0 中规定的小数符号:即 逗号 [,] 或句号 [.]。其中,逗号是首选符号。如果数字的大小更小 比统一,小数点前应加一个零(见 ISO 31-0);
c) 如果这些表达式中的年数、月数、天数、小时数、分钟数或秒数等于 零,数字和相应的代号可能不存在;但是,至少有一个数字及其 指定人应在场。请注意,不允许删除前导非零组件;
d) 如果所有时间分量都不存在,则指示符 T 将不存在。
所有这些都与维基百科的文章一致,因此持续时间为 500 毫秒的 ISO-8601 应该是 PT0,5S 或 PT0.5S
【讨论】:
由于 ISO 8601 表示日期和时间而不是间隔,所以我假设从 1970 年 1 月 1 日星期四开始为 500 毫秒(就像 unix 时间戳一样)。
1970-01-01T00:00:00.5Z
更新: 是的,根据您引用的文档,“PT0.5S”是正确的解释。 显然我之前的回答错过了文档中的持续时间部分,或者可能稍后添加。谢谢@strife25
【讨论】: