使用TimeZone.getDefault(),您的设备会返回什么?



getDisplayName(false, TimeZone.SHORT)的值是多少?

我认为该值是GMToffset,例如在新加坡它将是GMT+08:00

但是,在一台设备(谷歌像素2 XL)上,我得到了SGT

为什么会有差异?可能是Android Oreo还是提供网络提供的时区的SIM卡?我还认为这样的缩写或 3/4 个字母 ID 已经被弃用了。

最后,花了一段时间,但我弄清楚了为什么返回的时区格式不同。以下是我的发现:

当语言与设备上的时区匹配时(例如英语(马来西亚)并且时区设置为 +08:00 吉隆坡),则时区将以 3/4字母 ID(例如 MYT)返回。我不知道为什么会发生这种情况,但不知何故我偶然发现了这一点。

此外,不断以偏移量格式获取时区的方法将是使用它:

DateFormat date = new SimpleDateFormat("XXX", Locale.getDefault());
offset = date.format(new Date());

"三个字母的时区 ID 为了与 JDK 1.1.x 兼容,还支持其他一些三个字母的时区 ID(例如"PST"、"CTT"、"AST")。但是,它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如,"CST"可能是美国"中部标准时间"和"中国标准时间"),然后Java平台只能识别其中一个时区。

https://developer.android.com/reference/java/util/TimeZone.html

>过时的TimeZone.getDefault()及其现代等效ZoneId.systemDefault()都返回 JVM 的时区设置。除非做了一些特殊的事情来获取其他东西,否则这将与启动 JVM 时设备的时区设置相同。以后可能会由您的程序或在同一 JVM 中运行的其他程序更改它。另一方面,如果您更改设备设置,这不会影响 JVM(直到启动新的 JVM)。

您的设备很可能具有不同的时区设置。我认为亚洲/新加坡的设置更正确,即使出于实际的日常目的,UTC+08:00 是等效的。后者不是真正的时区,当涉及到历史日期时,它并不总是与新加坡时间一致。亚洲/新加坡时间也称为新加坡时间、SGT、新加坡标准时间或 SST。最后一个缩写也与萨摩亚标准时间共享,这是一个完全不同的时区(因此请避免使用这三个和四个字母的缩写)。

时区,如亚洲/新加坡,是共享同一时间的区域(区域),如新加坡共和国,不仅包括与 UTC 的当前偏移量,还包括偏移量的历史和已知未来变化。另一方面,与 UTC 或 GMT 的偏移量(如 +08:00)没有任何固有的有效位置或时间。它在某个时间的某个区域的有效性仅取决于时区。因此,使用偏移量作为设备的时区设置充其量是有问题的。旧的类TimeZone可用于表示时区或偏移量,这可能会模糊区别。在java.time中,区分了ZoneId(一个有名称的时区,通常以地区/城市格式推荐)和ZoneOffset。出于实用/实际原因,ZoneOffset也可以在需要ZoneId的情况下使用(通过继承实现)。

java.time

另一方面,考虑扔掉长期过时的TimeZone和朋友,改用现代Java日期和时间APIjava.time。使用起来要好得多。您需要的现代课程是ZoneId.它也有一个很好的getDisplayName方法。

  • 在 Java 8 及更高版本以及较新的 Android 设备上,java.time内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的反向移植(JSR 310的ThreeTen;请参阅底部的链接)。
  • 在较旧的Android上使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。并确保从带有子包的org.threeten.bp导入日期和时间类。

链接

  • Oracle 教程:日期时间,介绍如何使用java.time
  • Java 规范请求 (JSR) 310,其中首次描述了java.time
  • ThreeTen Backport 项目,将java.time向 Java 6 和 7 的反向移植(ThreeTen 用于 JSR-310)。
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。

相关内容

  • 没有找到相关文章