java - 如何更改日历偏移量?

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

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

我尝试了很多东西;

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 毫秒。

链接

关于java - 如何更改日历偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594399/

相关文章:

java JLabel 在 90 度旋转后无法正确重新绘制调整大小的标签

android - 使用 NDK 编译会出现成功包含头文件的错误

android - 如何在 Android 中获取默认的 CALENDAR_ID?

java - Calendar.HOUR_OF_DAY 始终显示提前 1 小时和 12 小时格式

Java:给定数组、整数和数组长度,递归搜索数组中的整数

java - Ubuntu 18.04 上的 Netbeans 11.2 - 无法访问类路径或 bootclasspath 中的 java.lang fatal error : Unable to find package java. lang

java - Android游戏分数int通过servlet添加到access数据库中

Android 当插入数据不存储到数据库中时

android - 在多个膨胀的 EditText 上设置文本会导致在旋转后全部填充相同的文本

android - 找出两毫秒之间的天数、周数、月数和年数。