我无法获得正确的时区与日光的偏移 [英] I'm unable to get the right timezone offset with daylight

查看:0
本文介绍了我无法获得正确的时区与日光的偏移的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我被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中的日期和时间类。

链接

这篇关于我无法获得正确的时区与日光的偏移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆