Java 时区和时间单位以及 Android 中的 SimpleDateFormat



https://gist.github.com/anonymous/e14bbbb89dd8636f1237c73dc8878b3f

我在此代码中遇到了一个错误,导致最后一个 switch 语句(第 298 - 307 行)返回当天的默认值和第二天的情况 0,当我的模拟器时区设置为 GMT+0 行的另一侧时,数据集来自。(即亚洲(如北京)的系统时间,以及东部时区(如亚特兰大)的数据集)

如何更新它以考虑其他时区的系统检查从 GMT+0 行另一侧的区域提供的数据?

如果您相信 JVM 的时区设置反映了用户的时区,那么以下是获取该时区中从今天到提供的天数的现代且正确的方法:

private static String getDayName(Context context, long dateInMillis) {
ZoneId zone = ZoneId.systemDefault();
LocalDate providedDate = Instant.ofEpochMilli(dateInMillis)
.atZone(zone)
.toLocalDate();
LocalDate today = LocalDate.now(zone);
int daysAfterToday = (int) ChronoUnit.DAYS.between(today, providedDate);
switch (daysAfterToday) {
case 0:
return context.getString(R.string.today);
case 1:
return context.getString(R.string.tomorrow );
default:
return providedDate.getDayOfWeek()
.getDisplayName(TextStyle.FULL, 
Locale.getDefault(Locale.Category.FORMAT));
}
}

我说"如果你相信你的JVM的时区设置反映了用户的时区",因为时区设置可能会被程序的其他部分或在同一JVM中运行的其他程序更改。如果你更了解用户的时区,你当然应该使用你的知识,例如:

ZoneId zone = ZoneId.of("America/Cordoba");

我更愿意插入一个检查,daysAfterToday是间隔 0 到 6。在从long转换为int之前。

我正在使用并热情推荐java.time,现代Java日期和时间API。它比过时的TimeZone类和您正在使用的臭名昭著的麻烦SimpleDateFormat要好得多。

问:我可以在 API 级别使用java.time吗?

是的,java.time在较旧和较新的Android设备上运行良好。

  • 在Java 8及更高版本以及新的Android设备上(从API级别26开始,我被告知),新的API是内置的。
  • 在Java 6和7中获取ThreeTen Backport,这是新类的反向移植(JSR 310的ThreeTen,其中首次描述了现代API)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。确保从包org.threeten.bp和子包导入日期和时间类。

链接

  • Oracle 教程:日期时间,说明如何使用java.time
  • 三十向后移植项目
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。
  • Java 规范请求 (JSR) 310。

相关内容

  • 没有找到相关文章

最新更新