如何更改日历偏移量?

How can I change the Calendar Offset?

我需要更改日历时区偏移量

我尝试了很多东西;

1-

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(TimeUnit.HOURS.convert(rawOffset, TimeUnit.MILLISECONDS) + 
System.currentTimeMillis());

2-

TimeZone timezone = new SimpleTimeZone();
timezone.setRawOffset(rawOffset);

Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(timezone);

我们的 API 返回 +1.0 时区(柏林)但我无法更改日历时区偏移量。怎么改?

java.time 和 ThreeTenABP

不要与原始偏移混在一起。 Java 比您更了解柏林的偏移量。并考虑不使用 Calendar。 class 存在许多设计问题,被认为早已过时。

    ZonedDateTime zdtBerlin = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
    System.out.println("Zeit in Berlin: " + zdtBerlin);

当我 运行 刚才这个片段时,我得到了这个输出:

Zeit in Berlin: 2019-02-08T19:23:00.275+01:00[Europe/Berlin]

顾名思义,ZonedDateTime里面有一个时区。在这种情况下 Europe/Berlin。它是 GregorianCalendar 的现代替代品(抽象 Calendar class 的最常见的具体子 class)。

问题:我可以在 Android 上使用 java.time 吗?

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

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置了现代 API。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

你的代码出了什么问题?

片段 1-:您将 Calendar 的时间设置为未来一小时。您没有设置时区。

代码段 2-:首先 SimpleTimeZone 没有无参构造函数,因此 new SimpleTimeZone() 无法运行。接下来,它的 setRawOffset 期望以毫秒为单位的偏移量。如果 rawOffset 为 1,则您设置的偏移量为 1 毫秒。

链接