我需要更改日历时区偏移量
我尝试了很多东西;
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
。该类存在许多设计问题,被认为早已过时。
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
中有一个时区。在这种情况下,欧洲/柏林。它是 GregorianCalendar
(抽象 Calendar
类最常见的具体子类)的现代替代品。
问题:我可以在 Android 上使用 java.time 吗?
是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
- 在 Java 6 和 7 中获取 ThreeTen Backport,这是现代类的反向端口(ThreeTen for JSR 310;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从
org.threeten.bp
导入日期和时间类。
你的代码出了什么问题?
fragment 1-:您正在将 Calendar
的时间设置为 future 一个小时。您没有设置时区。
代码段 2-:第一个 SimpleTimeZone
没有无参数构造函数,因此 new SimpleTimeZone()
将无法工作。接下来,它的 setRawOffset
需要一个以毫秒为单位的偏移量。如果 rawOffset
为 1,则您设置的偏移量为 1 毫秒。
链接
- Oracle tutorial: Date Time解释如何使用
java.time
。 - Java Specification Request (JSR) 310 ,其中首次描述了
java.time
。 - ThreeTen Backport project ,
java.time
到 Java 6 和 7(JSR-310 的 ThreeTen)的反向移植。 - ThreeTenABP , ThreeTen Backport 安卓版
- Question: How to use ThreeTenABP in Android Project ,并提供非常详尽的解释。
关于java - 如何更改日历偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594399/