tl;博士
Duration.parse( "PT1H30M" ).toMillis()
ISO 8601
无需发明自己的自定义速记格式。 ISO 8601 标准已经定义了一个类似的format for durations。
模式PnYnMnDTnHnMnS 使用P 标记开始,T 将任何年-月-日部分与任何小时-分钟-秒部分分开。
例子:
- 一个半小时是
PT1H30M。
-
P3Y6M4D 代表“三年六个月四天”。
java.time
java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。这包括 Period 和 Duration 类,用于表示未附加到时间轴的时间跨度。
Duration
Duration d = Duration.ofHours( 1 ).plusMinutes( 30 );
String output = d.toString();
PT1H30M
然后解析。
Duration d2 = Duration.parse( "PT1H30M" );
您可以询问持续时间的总毫秒数。
long millis = d2.toMillis();
5400000
见live code in IdeOne.com。
但请记住,java.time 类具有更精细的分辨率,即纳秒级。因此,在请求毫秒时,您可能会丢失数据。
另外,我强烈建议您坚持使用 java.time 对象和 ISO 8601 字符串,并避免将日期时间值表示为毫秒等计数。
Period
对于年-月-日,使用Period 类。
Period p = Period.parse( "P3Y6M4D" );
……和……
String output = p.toString();
P3Y6M4D
注意这个类的normalized 方法。例如,将“1 年 15 个月”的时间段标准化为“2 年 3 个月”。
另请注意,Period 是基于 LocalDate 信息构建的。因此,它没有时区的概念,也没有关于夏令时 (DST) 等异常的概念。
本课程以一整天的分辨率工作。所以这个类没有提供一个明确的方式来计算毫秒数。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。