如何从安卓手机获取时区?
Posted
技术标签:
【中文标题】如何从安卓手机获取时区?【英文标题】:How to get TimeZone from android mobile? 【发布时间】:2011-12-02 02:57:33 【问题描述】:我想在点击按钮时从 android 手机获取时区。
【问题讨论】:
时区 tz = TimeZone.getDefault();字符串 gmt1=TimeZone.getTimeZone(tz.getID()).getDisplayName(false,TimeZone.SHORT);字符串 gmt2=TimeZone.getTimeZone(tz.getID()).getDisplayName(false,TimeZone.LONG); Log.d("标签","时区:"+gmt1+"\t"+gmt2);这是代码 我不会对 asha v 如此粗暴。我只是在寻找同样的东西,而我找到的答案与这些不同。实际上通过确切的“TimeZone.getDefault”搜索将我带到了这里。 【参考方案1】:你试过用TimeZone.getDefault()
:
大多数应用程序将使用返回基于 TimeZone 的 TimeZone.getDefault() 在程序运行的时区。
参考:http://developer.android.com/reference/java/util/TimeZone.html
【讨论】:
如果您使用的是 JodaTime,您可以获得具有以下内容的 DateTimeZone:DateTimeZone.forTimeZone(TimeZone.getDefault());
@JoshPinter 我使用哪个包,android.icu.utils 上的那个还是 java.util 上的那个?
我将时区从设备更改为 CST,但它并没有返回 CST。有没有办法获取设备的时区?
我想知道,如果我们以某种方式伪造设备的时区,TimeZone.getDefault 是否会生效。安卓模拟器上好像没有。
@NeonWarge 虽然 android.icu 仅适用于 API 24 及更高版本,但两者都可以使用。【参考方案2】:
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezone id :: " +tz.getID());
输出:
TimeZone GMT+09:30 时区 ID :: Australia/Darwin
【讨论】:
@Flexo 如何从安卓设备获取时间戳 很好的解释与输出 对我来说,TimeZone.SHORT 的显示名称仅为 EST,TimeZone.LONG 的显示名称为东部标准时间。我正在寻找的只是 +/- 值大声笑。一定有什么改变了。【参考方案3】:编辑:更正案例
TimeZone.getDefault()
【讨论】:
【参考方案4】:我需要偏移量,它不仅包括夏令时,还包括一个数字。这是我在有人寻找示例时使用的代码。
我收到 "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);
【讨论】:
它对我有用,因为我只是处理持续时间(作为秒表)。【参考方案5】:试试这个代码-
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
它将返回用户选择的时区。
【讨论】:
为此创建一个Calendar
对象是无稽之谈。这种类型的对象的创建是昂贵的。 TimeZone.getDefault()
是获取此信息的适当方式。
@KrLx_roller 在否决答案之前请仔细检查。我已经写了我的答案返回用户选择的时区,而 TimeZone.getDefault() 将返回安装默认时区。欲了解更多信息,请code.google.com/p/android/issues/detail?id=2037。
您的代码在 android 4.2 上返回与 TimeZone.getDefault() 相同的时区。 TimeZone.getDefault() 将返回在设置 -> 日期和时间中选择的时区。【参考方案6】:
来自 java.time 和 ThreeTenABP 的 ZoneId
现代答案:
ZoneId zone = ZoneId.systemDefault();
System.out.println(zone);
当我在澳大利亚/悉尼时区运行这个 sn-p 时,输出就是这样:
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 年提出问题时所拥有的,尽管它设计得很糟糕。今天它已经过时了,我建议我们改用 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
导入日期和时间类以及子包。)
链接
Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了java.time
。
ThreeTen Backport project,java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。
ThreeTenABP,Android 版 ThreeTen Backport
Question: How to use ThreeTenABP in Android Project,解释得很透彻。
【讨论】:
更新到 API 级别 26 问题。 ThreeTenABP 通常不再需要,只要您使用的是 Android Gradle 插件 4.0 或更高版本。使用coreLibraryDesugaring
,您可以直接使用 java.time。【参考方案7】:
TimeZone timeZone = TimeZone.getDefault();
timeZone.getID();
它会像这样打印
Asia/Kolkata
【讨论】:
这就是我要找的东西!【参考方案8】:简单日期格式的最简单解决方案: 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
【讨论】:
【参考方案9】:在我的设备上,TimeZone.getDefault()
始终返回 UTC 时区。
我需要这样做来获取用户配置的时区:
TimeZone.setDefault(null)
val tz = TimeZone.getDefault()
它将返回用户选择的时区。
【讨论】:
【参考方案10】:这里的所有答案似乎都建议将 daylite 参数设置为 false。这对于许多根据一年中的时间更改缩写名称的时区是不正确的(例如 EST 与 EDT)。
以下解决方案将根据时区的当前日期为您提供正确的缩写。
val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
【讨论】:
TimeZone
类设计不佳且早已过时。【参考方案11】:
根据http://developer.android.com/reference/android/text/format/Time.html,您应该使用 Time.getCurrentTimezone() 来检索设备的当前时区。
【讨论】:
很酷,但自 API 级别 22 起已弃用【参考方案12】:对于具有 API 26 及更高版本的设备,您可以这样获取:
ZonedDateTime.now().getZone().toString();
【讨论】:
以上是关于如何从安卓手机获取时区?的主要内容,如果未能解决你的问题,请参考以下文章