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

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

【讨论】:

以上是关于如何从安卓手机获取时区?的主要内容,如果未能解决你的问题,请参考以下文章

android如何修改时区

安卓手机怎样更新时间?

android 安卓APP获取手机设备信息和手机号码的代码示例

从安卓手机获取匹配的联系人邮箱和手机

安卓51虚拟机无法修改时间

当我们在室内使用安卓手机时,如何快速获取经纬度或 GPS 数据?