最受支持 Java Date/Time Class

Most Supported Java Date/Time Class

我对 Android Studio 上的 date/time 年龄计算有疑问。我使用过压延机实例,它似乎在大多数情况下都有效,但有时它似乎不准确。

我切换到 LocalDate,它看起来更干净,但据我的研究所知,只有 API 26 及更高版本支持。我认为 Joda Time 也有同样的问题。

我的问题是:计算两个日期之间经过时间的最佳方法是什么最准确(考虑闰年、具有不同天数的月份等)并得到较低 API 版本(即 17 及以上)?

我一直在研究,看来答案可能是基本的压延机实例,但后来我又回到了可靠性和准确性问题上。任何输入将不胜感激。

tl;博士

ThreeTenABP 库与早期版本的 Android 一起使用。

Period.between(
    LocalDate.of( 2017 , Month.JUNE , 23 ) , 
    LocalDate.now( ZoneId.of( “Europe/Paris” ) )
)

使用java.time

最初的日期时间 classes 与 Java 的最早版本捆绑在一起是出于好意,但却是一个丑陋而令人困惑的混乱局面。始终避免DateCalendar

Joda-Time 是一个令人惊叹的行业领先成果,旨在打造一个强大的日期时间框架。它的主要作者斯蒂芬·科尔伯恩 (Stephen Colebourne) 继续利用在那里学到的经验教训来产生它的继任者,java.time classes 内置于 Java 8 & 9,由 JSR 310 定义。Joda-Time 项目现在处于维护模式,建议迁移到 java.time。

许多 java.time 功能被移植到 Java 6 和 Java 7ThreeTen-Backport 项目中。该项目包括一个实用程序 class,用于转换 to/from 遗留类型,因此您的新代码可以与旧的现有代码互操作。进一步适用于 ThreeTenABP 项目中的早期 Android。

例如,在 Java 平台上,您可以调用:

java.time.LocalDate localDate = java.time.LocalDate.of( 2018 , 1 , 23 ) ; // January 23rd, 2018.

…而在早期 Android 使用 ThreeTen-Backport/ThreeTenABP 项目你会调用:

org.threeten.bp.LocalDate localDate = org.threeten.bp.LocalDate.of( 2018 , 1 , 23 ) ; // January 23rd, 2018.

时间跨度

要将经过的时间计算为未附加到时间轴的时间跨度,请使用:

  • Period 年月日
  • Duration 表示小时、分钟、秒和以纳秒为单位的小数秒。

更简单地说…

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

在哪里获取java.timeclasses?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time classes.
    • 捆绑实施的更高版本
    • 对于较早的Android,ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See