Java 日历与 Android 日历有什么区别

What is difference between Java calendar vs Android calendar

我是 Android 的新手,我正在尝试获取当前日期,但 Android Calendar class requires API 24. I need to support older device and the Time class 自 API 以来已被弃用22.

问题是如何在 API 23 上获取当前日期,我使用适用于所有版本的 java.util.Calendar 解决了这个问题。那么我应该使用什么,Android 日历或 Java 日历?

请注意,使用 Android 日历时,日、月和年只是整数。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    day =android.icu.util.Calendar.getInstance().get(android.icu.util.Calendar.DAY_OF_MONTH);
    month = android.icu.util.Calendar.getInstance().get(android.icu.util.Calendar.MONTH);
    year = android.icu.util.Calendar.getInstance().get(android.icu.util.Calendar.YEAR);
}
else {
    day = java.util.Calendar.getInstance().get(java.util.Calendar.DAY_OF_MONTH);
    month = java.util.Calendar.getInstance().get(java.util.Calendar.MONTH);
    year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
}

并且仅使用 Java 日历时,无需检查 API 版本

day = java.util.Calendar.getInstance().get(java.util.Calendar.DAY_OF_MONTH);
month = java.util.Calendar.getInstance().get(java.util.Calendar.MONTH);
year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);

tl;博士

So what should I use, Android calendar or Java calendar?

都没有。

使用现代 java.time classes。通过 Gradle 插件 4.

在所有 Android 版本中可用
LocalDate.of( 2018 , Month.JANUARY , 23 ) 

避免遗留 classes

在 Java 中,可怕的 java.util.Calendar class(以及相关的 classes、Date 等)几年前被 java.time classes.现在在 Android 26 及更高版本中可用。

ThreeTen-Backport 库将 java.time 的功能带到 Java 6 & 7 使用几乎相同 API。该项目进一步适用于 ThreeTenABP 项目中的 Android <26。

我强烈建议避免遗留的 classes,而只使用 java.time classes。这些现代 classes 在 JSR 310 中定义,由领导行业领先 Joda-Time 库的同一个人 Stephen Colebourne 领导。所以他们有基于多年经验的优秀设计。使用 ThreeTenABP 非常值得将库添加到您的项目中。

对于只有日期、年月日、没有时间和时区的情况,使用 LocalDate class.

LocalDate ld = LocalDate.of( 2018 , 1 , 23 ) ; 

或者使用方便的 Month 枚举以获得更好的可读性。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ; 


关于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.

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

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

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* classes。 Hibernate 5 和 JPA 2.2 支持 java.time.

在哪里获取 java.time classes?