如何从Android手机获取TimeZone?

ash*_*a v 127 java timezone android

我想在点击按钮时从Android手机获取时区.

Mas*_*sim 178

你试过用过TimeZone.getDefault():

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

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

  • 如果您正在使用**JodaTime**,您可以使用以下命令获取DateTimeZone:`DateTimeZone.forTimeZone(TimeZone.getDefault());` (22认同)

Zul*_*qar 124

TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());
Run Code Online (Sandbox Code Playgroud)

输出:

TimeZone GMT + 09:30 Timezon id ::澳大利亚/达尔文

  • 对输出有很好的解释 (3认同)

Jig*_*shi 17

编辑:纠正案件

TimeZone.getDefault()


anu*_*har 13

试试这个代码 -

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Run Code Online (Sandbox Code Playgroud)

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

  • 为此创建一个`Calendar`对象是无稽之谈.这种类型的对象的创建是昂贵的.`TimeZone.getDefault()`是获得它的合适方法. (3认同)
  • @KrLx_roller请在downvoting回答之前仔细检查.我知道我的答案返回用户选择的时区,而TimeZone.getDefault()将返回安装默认时区.有关详细信息,请http://code.google.com/p/android/issues/detail?id=2037. (3认同)

Ole*_*.V. 13

来自 java.time 和 ThreeTenABP 的 ZoneId

现代答案:

    ZoneId zone = ZoneId.systemDefault();
    System.out.println(zone);
Run Code Online (Sandbox Code Playgroud)

当我在澳大利亚/悉尼时区运行此代码段时,输出正是:

Australia/Sydney
Run Code Online (Sandbox Code Playgroud)

如果您想要夏令时 (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);
Run Code Online (Sandbox Code Playgroud)
Eastern Summer Time (New South Wales)
EST
Run Code Online (Sandbox Code Playgroud)

TimeZone大多数其他答案中使用的类是我们在 2011 年提出问题时所使用的类,尽管它的设计很差。今天它已经过时了,我建议我们改用 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,现代类的 backport(ThreeTen for JSR 310;请参阅底部的链接)。
  • 编辑:通常在(较旧的)Android 上,只要您使用的是 Android Gradle 插件 4.0 或更高版本,coreLibraryDesugaring您就可以直接使用 java.time。不再需要 ThreeTenABP。(以前的项目符号:使用 ThreeTen Backport 的 Android 版本。它称为 ThreeTenABP。并确保您从org.threeten.bp子包中导入日期和时间类。)

链接

  • 更新 API 级别 26 问题。通常,只要您使用 Android Gradle 插件 4.0 或更高版本,就不再需要 ThreeTenABP。通过“coreLibraryDesugaring”,您可以直接使用 java.time。 (2认同)

Adn*_*aki 12

我需要的偏移不仅包括日光节省时间,还包括数字.这是我用过的代码,以防有人正在寻找一个例子.

我收到了"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);
Run Code Online (Sandbox Code Playgroud)


Raj*_*har 5

TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();
Run Code Online (Sandbox Code Playgroud)

它会像打印

Asia/Kolkata
Run Code Online (Sandbox Code Playgroud)


Bip*_*ipi 5

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

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

TimeZone.setDefault(null)
val tz = TimeZone.getDefault()
Run Code Online (Sandbox Code Playgroud)

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


Dum*_*ata 5

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

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

val tz = TimeZone.getDefault()
val isDaylight = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylight, TimeZone.SHORT)
Run Code Online (Sandbox Code Playgroud)