java - Java 日历与 Android 日历之间有什么区别

标签 java android calendar android-calendar java-calendar

我是 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 ) ; 

Table of all date-time types in Java, both modern and legacy


关于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 类?

Table of which java.time library to use with which version of Java or Android

关于java - Java 日历与 Android 日历之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52952347/

相关文章:

java - 声明 float ,为什么默认类型为 double?

c# - RSA 和 PublicKey 与 dotnet 的互操作

android - 如何禁用或不显示来自 emilsjolander 的 StickyListHeaders 的任何 header

java - 如何在 Android 应用程序运行时隐藏(或删除)操作栏

ruby-on-rails - 预订系统的Rails gem

java - 谷歌云语音NoSuchFieldError : CONTEXT_SPAN_KEY

android DatePickerDialog 在日和月之间切换位置

java - 日期不匹配

javascript - 完整日历,将逻辑应用于 defaultDate 设置

java - instanceOf 和 () 强制转换与 lambda 内的 Class.isInstance 和 Class.cast 方法引用进行比较