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

时间:2018-01-26 09:34:41

标签: java android timezone android-8.0-oreo

getDisplayName(false, TimeZone.SHORT)的价值是什么?

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

但是,在一台设备(Google Pixel 2 XL)上,我收到SGT

为何与众不同?可能是Android Oreo或提供网络提供的时区的SIM卡吗?我还认为这些缩写或3/4字母ID已经弃用了。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

过时的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.time,即现代Java日期和时间API。与它合作真是太好了。您需要的现代课程是ZoneId。它也有一个很好的getDisplayName方法。

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

链接

答案 2 :(得分:0)

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

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

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

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