getDisplayName(false, TimeZone.SHORT)
的价值是什么?
我认为价值是GMToffset
,例如在新加坡,它将是GMT+08:00
。
但是,在一台设备(Google Pixel 2 XL)上,我收到SGT
。
为何与众不同?可能是Android Oreo或提供网络提供的时区的SIM卡吗?我还认为这些缩写或3/4字母ID已经弃用了。
答案 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
的情况下使用(通过继承实现)。
另外,请考虑丢弃过时的TimeZone
和朋友,并使用java.time
,即现代Java日期和时间API。与它合作真是太好了。您需要的现代课程是ZoneId
。它也有一个很好的getDisplayName
方法。
java.time
内置。org.threeten.bp
导入日期和时间类。java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。答案 2 :(得分:0)
最后,花了一段时间,但我弄清楚为什么返回的时区格式不同。以下是我的发现:
如果语言与设备上的时区匹配(例如英语(马来西亚)且时区设置为+08:00吉隆坡),则时区将以3 / 4letterId(例如MYT)返回。我不知道为什么会这样,但不知何故我偶然发现了这一点。
另外,以偏移格式不断获取时区的方法是使用:
DateFormat date = new SimpleDateFormat("XXX", Locale.getDefault());
offset = date.format(new Date());