如何用JodaTime代表“时间” - java

我不确定如何解释“时间”,所以我想举一个例子。
编写电影播放器​​时,我想将开始时间(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

您关于Duration类的陈述是不正确的。您说它基于Instant,但是,不,不是。

Duration表示未附加到时间轴的时间跨度。 Joda-Time中的Duration只是毫秒数。这个事实在其Javadoc中有所说明。

Period的同上,表示未附加到时间轴上的时间跨度,以年-月-日-日为单位。 Duration的工作时间为时-分-秒。

代表五分钟的跨度:

Duration d = Duration.standardMinutes( 5 ) ;

如果要在该时间量内获得将来的时刻,请将持续时间添加到当前时刻。

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小时的大部分时间。这样的日子不是日历天,因为Duration没有附加到时间轴上。

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:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…