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

2022-08-24 00:00:00 date android simpledateformat java

我被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偏移量返回零。我应该怎么处理日光? 另一个音符我的时间约旦/安曼, 冬季应返回+2,但夏季应返回+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();

摘自文档:

退货:

true如果TimeZone使用夏令时, 否则。

因此该方法不会更改任何内容,当然也不会更改UTC时区。它只查询所述时区是否使用夏令时(夏令时)。因此,由于亚洲/安曼时区有,因此在您的情况下应该会返回true

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

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

  • 在Java 8和更高版本以及更新的Android设备(从API级别26开始)上,现代API是内置的。
  • 在非Android Java 6和7中,获取ThreeTen Backport,这是现代类的后端口(对于JSR 310,获取ThreeTen;请参阅底部的链接)。
  • 在较老的安卓系统上,可以使用去糖化或安卓版本的ThreeTen Backport。它被称为ThreeTenABP。在后一种情况下,请确保从子程序包中导入org.threeten.bp中的日期和时间类。

链接

  • Oracle tutorial: Date Time解释如何使用java.time。
  • Java Specification Request (JSR) 310,其中首先描述了java.time
  • ThreeTen Backport project,java.time到Java 6和7的后端口(JSR-310为ThreeTen)。
  • Java 8+ APIs available through desugaring
  • ThreeTenABP,ThreeTen Backport Android版
  • Question: How to use ThreeTenABP in Android Project,并有非常详细的解释。

相关文章