如何从Android手机获取TimeZone?


139

单击按钮时,我想从Android手机获取时区。


11
TimeZone tz = TimeZone.getDefault(); 字符串gmt1 = TimeZone.getTimeZone(tz.getID())。getDisplayName(false,TimeZone.SHORT); 字符串gmt2 = TimeZone.getTimeZone(tz.getID())。getDisplayName(false,TimeZone.LONG); Log.d(“ Tag”,“ TimeZone:” + gmt1 +“ \ t” + gmt2); 这是代码
asha v

10
对于asha v,我不会那么粗鲁。我只是在寻找同一件事,而我发现的答案与这些答案有所不同。实际上,通过精确的“ TimeZone.getDefault”进行搜索导致了我的到来。
2012年

Answers:


189

您是否尝试过使用TimeZone.getDefault()

大多数应用程序将使用TimeZone.getDefault(),它根据程序运行的时区返回TimeZone。

参考:http : //developer.android.com/reference/java/util/TimeZone.html


22
如果您使用的是JodaTime,则可以获得以下内容的DateTimeZone:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter

@JoshPinter我要使用哪个包,是android.icu.utils还是java.util?
霓虹灯Warge'9

1
我将时区从设备更改为CST,但这并没有给我CST。有没有办法获取设备的时区?
Abhinav Saxena'2

我想知道,如果我们以某种方式伪造设备的时区,TimeZone.getDefault是否会生效。它似乎不在android模拟器上。
Hau Luu

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

输出:

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


@Flexo如何从Android设备获取时间戳
KOUSIK Daniel

4
输出的绝佳解释
Anand Savjani


14

我需要的补偿不仅包括日光节约时间,而且还包括数字。如果有人在寻找示例,这是我使用的代码。

我得到的响应是“ 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

13

试试这个代码-

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

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


4
Calendar为此创建对象是胡说八道。此类对象的创建非常昂贵。TimeZone.getDefault()是获取此信息的合适方法。
2013年

3
@KrLx_roller在拒绝答案之前,请仔细检查。我写了我的答案返回用户选择的时区,而TimeZone.getDefault()将返回安装默认时区。有关更多信息,请code.google.com/p/android/issues/detail?id=2037
anujprashar 2013年

您的代码返回的时区与android 4.2上的TimeZone.getDefault()相同。TimeZone.getDefault()将返回在设置->日期和时间中选择的时区。
user1088166 2013年

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

它会打印像

Asia/Kolkata

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   " );

==>输出为:+05:30



2

来自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

TimeZone其他大多数答案中使用的班级是我们在2011年提出问题时所拥有的课程,即使该课程设计不良。今天,它早已过时,我建议我们改用2014年推出的现代Java日期和时间API java.time。

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

java.time在旧的和更新的Android设备上均可正常运行。它至少需要Java 6

  • 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。
  • 在非Android Java 6和7中,获取ThreeTen反向端口,即现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在较旧的Android上,请使用Android版本的ThreeTen Backport。它称为ThreeTenABP。并确保您导入org.threeten.bp带有子包的日期和时间类。

链接



1

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

我需要执行此操作以获取用户配置的时区:

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

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


0

这里的所有答案似乎都建议将daylite参数设置为false。这对于许多时区是不正确的,这些时区会根据一年中的时间更改缩写名称(例如,EST与EDT)。

下面的解决方案将根据时区的当前日期为您提供正确的缩写。

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)

TimeZone课程的设计不佳,而且已经过时了。
Ole VV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.