我不确定如何解释“时间”,所以我想从一个例子开始。
当我编写电影播放器时,我想将以毫秒为单位的开始时间(00:00:00)表示为0,如果当前帧位置为5分钟(00:05:00),则它将是300,000(5 * 60 * 1000)。
我不关心现实世界中的时区、日历或时钟信息。
但是,以 JodaTime 为例,Instant
与 Unixtime(基于 1970 年)、Interval
、Duration
和 Period 相关
基于 Instant
,而 LocalTime
基于 24 小时制(强制小时字段为 1-24)。
当然,我可以手动将“00:05:00”解析为 300,000,但我想知道如何使用 JodaTime 或其他库来实现这个目标。
最佳答案
持续时间
您关于 Duration
的声明类不正确。您说它是基于 Instant
,但是,不,它不是。
Duration
表示未附加到时间线的时间跨度。 Joda-Time 中的持续时间
仅仅是毫秒数。这个事实在其 Javadoc 中已有说明。
Period
也是如此,它表示不依附于年-月-日时间线的时间跨度。 Duration
的工作范围为小时-分钟-秒。
要表示五分钟的跨度:
Duration d = Duration.standardMinutes( 5 ) ;
如果您想在这段时间内获得 future 的时刻,请将该持续时间添加到当前时刻。
Instant fiveMinutesInFuture = new Instant().plus( d ) ;
ISO 8601
要将持续时间表示为文本,请使用标准 ISO 8601 格式,以 P
开头,并使用 T
将年-月-日部分与小时-分钟-秒部分。
所以五分钟是PT5M
。
String output = d.toString() ;
解析此类 ISO 8601 字符串。
Duration d = Duration.parse( "PT5M" ) ; // Five minutes.
时钟格式
要将 duration
对象序列化为文本,请始终使用 ISO 8601 标准格式,切勿使用时钟格式。
对于用户界面演示,我建议您不要使用时钟符号(例如 00:05:00
)来表示时间跨度。这样做会让用户感到困惑和不明确。请改用 ISO 8601 标准格式,因为它们的设计实用且明确。
如果您坚持以时钟时间格式表示持续时间,请调用 getStandard...
方法来获取小时、分钟和秒。
String output =
String.format( "%02d", d.getStandardHours() ) +
":" +
String.format( "%02d", d.getStandardMinutes() ) +
":" +
String.format( "%02d", d.getStandardSeconds() )
;
00:05:00
如果持续时间可能超过 24 小时,您还需要调用 getStandardDays
。这些天只是 24 小时的一段时间。这些日子不是日历日,因为持续时间
未附加到时间线。
java.time
请注意,Joda-Time 现在处于维护模式。它的后继者 java.time 内置于 Java 8 及更高版本以及 Android 26+ 中。对于 Java 6 和 7,请使用 ThreeTen-Backport。对于早期的 Android,请使用 ThreeTenABP。
这里讨论的 java.time 中的概念是相同的。 java.time.Duration
类非常相似,只是纳秒的分辨率更高并且语法略有不同。
Instant.now().plus(
Duration.ofMinutes( 5 )
)
或者:
Instant.now().plus(
Duration.parse( "PT5M" )
)
要构建时钟读数,请调用 to…Part
方法。
String output =
String.format( "%02d", d.toHoursPart() ) +
":" +
String.format( "%02d", d.toMinutesPart() ) +
":" +
String.format( "%02d", d.toSecondsPart() )
;
00:05:00
关于java - 如何用 JodaTime 表示 'time',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59622692/