【问题标题】:Calendar date is different日历日期不同
【发布时间】:2019-05-05 23:02:54
【问题描述】:

为什么 Android 中的Calendar 在不同的 Android 设备上给出不同的日期? 我确实获得了默认语言环境,但我仍然遇到同样的问题。

代码:

calendar = Calendar.getInstance();
currentDate = DateFormat.getDateInstance(DateFormat.DATE_FIELD,Locale.getDefault())
    .format(calendar.getTime());

【问题讨论】:

  • 顺便考虑扔掉长期过时且臭名昭著的麻烦DateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 如果将DateFormat.DATE_FIELD 传递给getDateInstance 符合您的预期,那纯属巧合。它的值为 3,如果这是您想要的,请使用 DateFormat.SHORT(也为 3)。
  • 您预计是哪一天?你得到多少不同的日期?某些设备上的前一​​天或后一天,或者日期很远?为了让我们了解您的情况和问题所在,请准确说明您期望的日期以及您实际获得的日期的尽可能多的示例。此外,这将有助于了解不同设备的时区设置。

标签: java android calendar date java.util.calendar


【解决方案1】:

为什么 android 中的 Calendar 在不同的 android 设备上给出不同的日期?

  1. Calendar.getInstance 使用系统时钟,所以如果不同设备的时钟设置不同,你会得到不同的时间。
  2. 您的日期格式使用 JVM 的默认时区(与语言环境无关)。由于所有时区的日期都不会相同,因此您应该得到不同的日期(即使系统时钟已正确设置为当前时间)。

也就是说,CalendarDateFormat 类有相当严重的设计问题,我认为它们早已过时。如果您在应用程序中对日期或时间进行大量工作,您可能应该改用 java.time。它是现代 Java 日期和时间 API,设计得更好,使用起来也更好。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多