从不带时区名称的时区获取时区偏移值

2022-08-31 15:44:17

我需要将手机的时区保存为 [+/-]hh:mm 格式

我正在使用时区类来处理这个问题,但我唯一能得到的格式如下:

PST -05:00
GMT +02:00

我宁愿不对结果进行子串,是否有任何键或选项标志可以设置为仅获取该时区的值而不是该时区的名称(GMT / CET / PST...)?


答案 1

我需要将手机的时区保存为 [+/-]hh:mm 格式

不,您不需要。偏移量本身是不够的,您需要存储整个时区名称/ID。例如,我住在奥斯陆,我目前的偏移量是+02:00,但在冬季(由于),它是+01:00。标准时间和夏令时之间的确切切换取决于您不想探索的因素。

因此,而不是存储(或者应该是?我存储在我的数据库中。现在我可以使用以下命令恢复完整配置:+ 02:00+ 01:00"Europe/Oslo"

TimeZone tz = TimeZone.getTimeZone("Europe/Oslo")

想知道我今天的时区偏移量是多少吗?

tz.getOffset(new Date().getTime()) / 1000 / 60   //yields +120 minutes

然而,在12月也是如此:

Calendar christmas = new GregorianCalendar(2012, DECEMBER, 25);
tz.getOffset(christmas.getTimeInMillis()) / 1000 / 60   //yields +60 minutes

足以说明:存储时区名称或ID,每次要显示日期时,请检查当前偏移量(今天)而不是存储固定值。您可以使用 TimeZone.getAvailableIDs() 枚举所有受支持的时区 ID。


答案 2

@MrBean - 我处于类似的情况,我必须调用第三方网络服务并以+/-hh:mm格式传入Android设备的当前时区偏移量。这是我的解决方案:

public static String getCurrentTimezoneOffset() {

    TimeZone tz = TimeZone.getDefault();  
    Calendar cal = GregorianCalendar.getInstance(tz);
    int offsetInMillis = tz.getOffset(cal.getTimeInMillis());

    String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
    offset = (offsetInMillis >= 0 ? "+" : "-") + offset;

    return offset;
} 

推荐