Android中的Java TimeZone和TimeUnit以及SimpleDateFormat

时间:2018-03-19 05:19:32

标签: java android timezone dayofweek android-date

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

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

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

1 个答案:

答案 0 :(得分:2)

如果您相信您的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相比,它的工作效果要好得多。

问题:我可以将java.time用于我的API级别吗?

是的,java.time适用于较旧和较新的Android设备。

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

链接