java - 如何用 JodaTime 表示 'time'

标签 java android time jodatime

我不确定如何解释“时间”,所以我想从一个例子开始。
当我编写电影播放器​​时,我想将以毫秒为单位的开始时间(00:00:00)表示为0,如果当前帧位置为5分钟(00:05:00),则它将是300,000(5 * 60 * 1000)。
我不关心现实世界中的时区、日历或时钟信息。

但是,以 JodaTime 为例,Instant 与 Unixtime(基于 1970 年)、IntervalDurationPeriod 相关 基于 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/

相关文章:

JAVA客户端-服务器软件,多台机器

time - Ada 中任务的 CPU 时间

java - UTC 给定时区的日期和时间

c - Linux Mint 中的时间结构

java - 验证登录详细信息后返回用户名的登录 servlet

java - 加载图像时遇到问题

android - 如何检测视频搜索开始

java - 解析不显示内容

java - 实现 IWorkbenchPreferencePage 在查看首选项页面时会出现 NPE

安卓闹钟不工作