【问题标题】:How can I change the Calendar Offset?如何更改日历偏移量?
【发布时间】:2019-07-02 19:30:43
【问题描述】:

我需要更改日历时区偏移

我尝试了很多东西;

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 时区(柏林)但我无法更改日历时区偏移量。怎么改?

【问题讨论】:

  • “我们的 API 返回 +1.0 时区(柏林)”——double??
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的旧日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。进一步适用于ThreeTenABP 中的早期 Android (How to use ThreeTenABP…

标签: java android android-calendar timezone-offset java.util.calendar


【解决方案1】:

java.time 和 ThreeTenABP

不要与原始偏移量混合。 Java 比您更了解柏林的偏移量。并考虑不使用Calendar。该类有许多设计问题,被认为已经过时了。

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

当我刚才运行这个 sn-p 时,我得到了这个输出:

柏林时间:2019-02-08T19:23:00.275+01:00[Europe/Berlin]

顾名思义,ZonedDateTime 中有一个时区。在这种情况下,欧洲/柏林。它是GregorianCalendar(抽象Calendar 类最常见的具体子类)的现代替代品。

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

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

你的代码出了什么问题?

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

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

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2014-12-10
    相关资源
    最近更新 更多