我无法通过日光获得正确的时区偏移

I'm unable to get the right timezone offset with daylight

我在 android 遇到了日光问题,时间应该是 +3 GMT/UTC 但我只得到 +2。有什么解决办法还是我无法处理?请在下面找到我的代码

  TimeZone.getDefault().useDaylightTime();
  SimpleDateFormat df = new SimpleDateFormat("HH:mm",Locale.ENGLISH); //"2021-02-18T11:00:00"
        df.setTimeZone(TimeZone.getTimeZone("UTC"));
        return df.format(calendar.getTime());

请注意 DST OFFSET 为 returning 零。我应该怎么做才能处理日光? 另外注意我的时间是约旦/安曼, 冬天应该 return +2 但夏天应该 return +3

java.time

考虑使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。让我们首先为您想要的时间格式声明一个格式化程序:

private static final DateTimeFormatter TIME_FORMATTER
        = DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH);

现在您可以这样格式化 Calendar 中的时间:

    // Assume you are getting a Calendar from somewhere
    Calendar calendar = new GregorianCalendar();
    
    ZonedDateTime dateTime = calendar.toInstant().atZone(ZoneId.systemDefault());
    String dateTimeString = dateTime.format(TIME_FORMATTER);
    
    System.out.println(dateTimeString);

我运行刚才的代码,也就是UTC的16:33或者约旦的19:33。输出是:

19:33

如果您不依赖于从某处获取老式 Calendar,它可能更简单、更干净。例如,要获取您所在时区的当前时间:

    String timeString
            = LocalTime.now(ZoneId.systemDefault()).format(TIME_FORMATTER);
    System.out.println(timeString);

你的代码出了什么问题?

您将 SimpleDateFormat 的时区设置为 UTC。因此,无论您的默认时区如何,都会打印 UTC 时间。由于 UTC 没有夏令时 (DST),因此没有考虑到这一点。

顺便说一句,你的这个方法调用什么都不做:

    TimeZone.getDefault().useDaylightTime();

来自文档:

Returns:

true if this TimeZone uses Daylight Saving Time, false, otherwise.

所以该方法不会改变任何东西,当然也不会改变 UTC 时区。它只查询所提到的时区是否使用夏令时(夏令时)。因此,由于 Asia/Amman 时区存在,因此在您的情况下应该 return true

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接