如何从安卓手机中获取时区信息?

184

当点击按钮时,我想从 Android 手机中获取时区。


12
TimeZone tz = TimeZone.getDefault(); String gmt1=TimeZone.getTimeZone(tz.getID()).getDisplayName(false,TimeZone.SHORT); String gmt2=TimeZone.getTimeZone(tz.getID()).getDisplayName(false,TimeZone.LONG); Log.d("Tag","TimeZone : "+gmt1+"\t"+gmt2);这段代码的作用是获取当前时区并将其显示为短格式和长格式的字符串。其中,变量 "tz" 存储了默认的时区信息,变量 "gmt1" 存储了时区的短格式名称,变量 "gmt2" 存储了时区的长格式名称。最后,通过日志输出来展示这些信息。 - asha v
10
我不会对asha v.太苛刻,我只是在寻找同样的东西,但我找到的答案与这些不同。实际上,使用确切的“TimeZone.getDefault”进行搜索引导了我来到这里。 - Yar
13个回答

238

23
如果你正在使用JodaTime,你可以通过以下方式获取一个DateTimeZone:DateTimeZone.forTimeZone(TimeZone.getDefault()); - Joshua Pinter
@JoshPinter 我应该使用哪个包,android.icu.utils还是java.util? - Neon Warge
1
我将设备的时区更改为CST,但它没有返回CST。有没有一种方法可以获取设备的时区? - Abhinav Saxena
我在想,如果我们以某种方式伪造设备的时区,TimeZone.getDefault是否会受到影响。在Android模拟器上似乎不是这样。 - Harvey
@NeonWarge 两种都可以使用,尽管 android.icu 只适用于 API 24 及以上的版本。 - Nicolas
这个答案对我没用。结果总是UTC。 - Murat Aktay

158
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezone id :: " +tz.getID());

输出:

时区 GMT+09:30,时区ID:澳大利亚/达尔文


@Flexo 如何从Android设备获取时间戳 - KOUSIK daniel
4
很好的解释,附带输出结果。 - Anand Savjani
1
对我来说,TimeZone.SHORT 的显示名称只是 EST,而 TimeZone.LONG 则为 Eastern Standard Time。我只是在寻找 +/- 值哈哈。一定有些变化了。 - FoxDonut
@FoxDonut 请尝试使用 TimeZone.SHORT_GMT。 - userVadim

21

17

我需要一个包括夏令时并且是数字化的偏移量。以下是我使用的代码,以防有人需要示例:

我得到了一个"3.5" (3:30')的响应,这是我在伊朗德黑兰在冬季所期望的,以及"4.5" (4:30')在夏季。

我还需要它作为一个字符串,以便我可以将其发送到服务器,所以你可能不需要最后一行代码。

获取当前时区的代码:

TimeZone tz = TimeZone.getDefault();
Date now = new Date();
//Import part : x.0 for double number
double offsetFromUtc = tz.getOffset(now.getTime()) / 3600000.0;
String m2tTimeZoneIs = Double.parseDouble(offsetFromUtc);

1
对我来说它起作用了,因为我只是处理时间间隔(作为秒表)。 - Ahsan

14

试一下这段代码 -

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();

它将返回用户选择的时区。


4
为此创建一个 Calendar 对象是无意义的。这种类型的对象的创建很昂贵。使用 TimeZone.getDefault() 是获得这个的正确方法。 - anonymous
3
在给答案投反对票之前,请仔细检查。我的答案返回用户选择的时区,而TimeZone.getDefault()将返回安装默认时区。有关更多信息,请参见http://code.google.com/p/android/issues/detail?id=2037。 - anujprashar
你的代码在Android 4.2上返回与TimeZone.getDefault()相同的时区。TimeZone.getDefault()将返回在设置->日期和时间中选择的时区。 - idunno

14

使用java.time和ThreeTenABP获取ZoneId

现代方法:

    ZoneId zone = ZoneId.systemDefault();
    System.out.println(zone);

当我在澳大利亚/悉尼时区运行这个代码片段时,输出结果完全一样:
Australia/Sydney

如果您想获取夏令时(DST)感知的时区名称或缩写:

    DateTimeFormatter longTimeZoneFormatter = DateTimeFormatter.ofPattern("zzzz", Locale.getDefault());
    String longTz = ZonedDateTime.now(zone).format(longTimeZoneFormatter);
    System.out.println(longTz);
    
    DateTimeFormatter shortTimeZoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.getDefault());
    String shortTz = ZonedDateTime.now(zone).format(shortTimeZoneFormatter);
    System.out.println(shortTz);
Eastern Summer Time (New South Wales)
EST

当2011年提出这个问题时,大多数其他答案中使用的TimeZone类是我们拥有的,尽管它设计得很差。如今它已经过时了,我建议我们使用java.time,即2014年推出的现代Java日期和时间API。

问题:java.time是否需要Android API级别26?

java.time在旧版和新版Android设备上都能正常工作。它只需要至少Java 6

  • 在Java 8及更高版本以及新版Android设备(API级别26或更高)上,现代API已经内置。
  • 在非Android Java 6和7中,可以使用ThreeTen Backport,即现代类的后移版本(JSR 310的ThreeTen;参见底部链接)。
  • 编辑:通常,在(较旧的)Android上,只要您使用Android Gradle插件4.0或更新版本,并启用coreLibraryDesugaring,就可以直接使用java.time。不再需要ThreeTenABP。(原来的项目:使用ThreeTen Backport的Android版,称为ThreeTenABP。确保从org.threeten.bp导入日期和时间类及其子包。)

链接


2
API 等级更新至 26 的问题。通常情况下,只要您使用的是 Android Gradle 插件 4.0 或更高版本,就不再需要 ThreeTenABP。通过 coreLibraryDesugaring,您可以直接使用 java.time。 - Jonik

12
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

它将打印为

Asia/Kolkata

1
这就是我一直在寻找的! - Maulik Dodia

5

在我的设备上,TimeZone.getDefault() 总是返回UTC时区。

我需要这样做来获取用户配置的时区:

TimeZone.setDefault(null)
val tz = TimeZone.getDefault()

此函数将返回用户选择的时区。


搜索了好几个小时,为什么 TimeZone.getDefault() 总是返回 UTC。感谢提供解决方案。 - Lybrica

5
所有这里的回答都似乎建议设置日光参数为false。对于许多会根据一年中的时间更改缩写名称的时区(例如EST vs. EDT),这是不正确的。
以下解决方案将根据当前日期为时区提供正确的缩写名称。
val tz = TimeZone.getDefault()
val isDaylight = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylight, TimeZone.SHORT)

1
TimeZone(时区)类设计不佳并且已经过时很久了。 - Ole V.V.

3

使用简单的日期格式化解决方案: SimpleDateFormat("ZZZZZ"):

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.getDefault());
        Date currentLocalTime = calendar.getTime();

        DateFormat date = new SimpleDateFormat("ZZZZZ",Locale.getDefault());
        String localTime = date.format(currentLocalTime);
        System.out.println(localTime+ "  TimeZone   " );

==> Output is : +05:30


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接