我是 Android 的新手,我正在尝试获取当前日期,但 Android Calendar
类需要 API 24。我需要支持旧设备和 Time
类自 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;dr
So what should I use, Android calendar or Java calendar?
都不是。
使用现代 java.time 类。通过 Gradle Plugin 4 在所有 Android 版本中可用。
LocalDate.of( 2018 , Month.JANUARY , 23 )
避免遗留类
在 Java 中,可怕的 java.util.Calendar
类(和相关类,Date
等)在多年前被 java.time 类。现在适用于 Android 26 及更高版本。
ThreeTen-Backport 库使用几乎相同的 API 将 java.time 的功能引入 Java 6 和 7。该项目在 ThreeTenABP 项目中进一步适用于 Android <26。
我强烈建议避免使用遗留类,而只使用 java.time 类。这些现代类在 JSR 310 中定义,由领导行业领先的 Joda-Time 库的同一个人 Stephen Colebourne 领导。所以他们有基于多年经验的优秀设计。使用 ThreeTenABP 非常值得将库添加到您的项目中。
对于只有日期、年月日、没有时间和时区的情况,请使用 LocalDate
类。
LocalDate ld = LocalDate.of( 2018 , 1 , 23 ) ;
或者使用方便的 Month
枚举以提高可读性。
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .
Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。
您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.*
类。 Hibernate 5 和 JPA 2.2 支持 java.time。
从哪里获取 java.time 类?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , 以及后来的 - 标准 Java API 的一部分,带有 bundle 实现。
- Java 9带来了一些次要功能和修复。
- Java SE 6和 Java SE 7
- 在 ThreeTen-Backport 中,大部分 java.time 功能都向后移植到 Java 6 和 7。 .
- Android
- 更高版本的 Android(26+) bundle 了 java.time 类的实现。
- 对于早期的 Android (<26),称为 API desugaring 的进程带来一个subset of the java.time Android 最初未内置的功能。
- 如果脱糖没有提供您需要的东西,ThreeTenABP项目改编ThreeTen-Backport (上面提到的)Android。参见 How to use ThreeTenABP… .
关于java - Java 日历与 Android 日历之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52952347/