gpt4 book ai didi

java - 在 java/android 和夏令时处理日期/时间

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:29 25 4
gpt4 key购买 nike

我正在为 Android 制作一个日记应用程序,我想让用户选择他们所在的时区。时间一直是我编程上的一个困惑领域。

我将为可用时区创建一个枚举。

我将以 long UTC 格式将日期/时间条目保存到 sqlite,然后在 Java 中以编程方式处理偏移量和 DST 以用于显示目的。

我实际上知道 Java 在日期/时间处理方面的局限性。

Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC")); //returns the current time in UTC format
Long utcLong = utc.getTimeInMillis(); //returns current utc time in long for database insertion

问题 1:我将如何对其应用偏移量并说明何时应用任何额外的 DST 偏移量?因为并非所有时区都遵守夏令时,而夏令时在不同时区的不同日期生效。

问题 2:Java 的 TimeZone 类有大约 800 个 ID,用户必须滚动浏览 800 个选项才能找到适用于他们的选项,这对用户来说很烦人。有可用的简短列表吗?我认为大约有 50 个有用的时区。

最佳答案

首先,我建议您不要使用Calendar 类。它已经过时并且有 lots of bugs and design issues 。这个糟糕的 API 被更好的 API 所取代:

下面的代码适用于所有人,唯一的区别是包名称(在 Java 8 中是 java.time,在 ThreeTen Backport 中是 org.threeten.bp) , 但类和方法名称相同。

要获取 UTC 当前日期/时间,最好的选择是使用 Instant 类:

// current date/time in UTC - now() always returns the current instant in UTC
Instant instant = Instant.now();
System.out.println(instant); // 2017-06-03T18:03:55.976Z

// equivalent to calendar.getTimeInMillis(), it returns a long
System.out.println(instant.toEpochMilli()); // 1496513035976

要将此时刻转换为时区,您可以将 ZoneIdZonedDateTime 一起使用:

// ZoneId accepts the same IDs used by TimeZone
ZoneId zone = ZoneId.of("America/Sao_Paulo");
// convert instant to timezone
ZonedDateTime z = instant.atZone(zone);
System.out.println(z); // 2017-06-03T15:03:55.976-03:00[America/Sao_Paulo]

// converts back to UTC (returns an Instant)
System.out.println(z.toInstant()); // 2017-06-03T18:03:55.976Z

上面的代码已经处理了 DST 更改,因此与 UTC 之间的转换非常简单。

时区列表

您说您有大约 50 个“有用”时区的列表。我不知道您用来定义该列表的标准是什么,但是如果用户所在的时区不在列表中会怎样?

this linkhere 中有一些时区选择用户界面的想法。您可以选择一个并适应您的应用。

我还建议不要使用(如果可能)3 个字母的时区缩写(如CSTPST),因为它们是 ambiguous and not standard .最好使用全名(例如 America/Sao_PauloEurope/London),因为它们是 Java 的 API 使用的名称(您可以使用 ZoneId.getAvailableZoneIds()) 并且它们配置了每个区域的所有 DST 更改。

关于java - 在 java/android 和夏令时处理日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com