【问题标题】:Most Supported Java Date/Time Class最受支持的 Java 日期/时间类
【发布时间】:2018-01-30 14:52:24
【问题描述】:

我对 Android Studio 上的日期/时间年龄计算有疑问。我使用了 calander 实例,它似乎在大多数情况下都有效,但时不时地似乎不准确。

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

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

我一直在研究,似乎答案可能是基本的日历实例,但后来我又回到了可靠性和准确性问题。任何意见将不胜感激。

【问题讨论】:

  • 可能使用 3rd-party 库(ThreetenABP、Joda-Time for Android 或 Time4A)?
  • 谢谢 Meno,是的,我在 Joda-Time 上遇到了同样的问题,但我会再试一次...
  • 对于年龄计算,我建议:a) ThreetenABP(java.time 的反向移植)=> ChronoUnit.YEARS.between(LocalDate, LocalDate) 或 b) Time4A(具有更多功能的更大库)=> CalendarUnit.YEARS.between(PlainDate, PlainDate)

标签: android calendar localdate


【解决方案1】:

tl;博士

在早期版本的 Android 中使用 ThreeTenABP 库。

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

使用java.time

与最早的 Java 版本捆绑在一起的原始日期时间类是出于好意,但却是一个非常丑陋的混乱混乱。始终避免使用DateCalendar等。

Joda-Time 是一项令人惊叹的行业领先努力,旨在打造一个强大的日期时间框架。它的主要作者 Stephen Colebourne 继续利用从那里学到的经验来制作它的继任者,Java 8 和 9 中内置的 java.time 类,由 JSR 310 定义。Joda- Time 项目现在处于维护模式,建议迁移到 java.time。

ThreeTen-Backport 项目中的大部分 java.time 功能都向后移植到 Java 6 和 Java 7。该项目包括一个实用程序类,用于转换为/从旧类型转换,因此您的新代码可以与旧的现有代码互操作。在 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 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

【讨论】:

  • Basil,谢谢...我遇到的问题是 LocalDate.of(year,month,day) ,这是我在“of”上得到错误的地方,说它需要API 26 或更高...不过我仍在研究它。我不想回到日期、日历……等等。
  • @ErrolNiel java.time (JSR 310) 的实现仅添加到最新版本的 Android 中。如果您的项目设置为为早期版本的 Android 构建,则您没有可用的 LocalDate 类,因此调用 LocalDate.of 时会出现编译器错误。作为替代方案,您必须将库添加到您的项目,以替代缺少的 java.time 类。该库是 ThreeTen-Backport,打包为 Android 的 ThreeTenABP。您无需调用java.time.LocalDate.of,而是调用org.threeten.bp.LocalDate.of。使用import 语句,例如import org.threeten.bp.* ;
  • 谢谢罗勒,我会试试的。我将查找 ThreeTenABP 的必要导入。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2017-04-15
  • 2014-07-06
  • 2022-12-07
  • 1970-01-01
  • 2022-10-18
相关资源
最近更新 更多