如何从 android 手机获得 TimeZone?

当我点击一个按钮时,我想从 Android 手机上获得时区信息。

175627 次浏览

你曾否尝试使用 TimeZone.getDefault():

大多数应用程序将使用返回基于 在程序运行的时区上。

档号: http://developer.android.com/reference/java/util/TimeZone.html

编辑: 纠正案例

TimeZone.getDefault()

试试这个密码

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

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

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

产出:

TimeZone GMT + 09:30 TimeZone id: : Australia/Darwin 时区编号: : 澳大利亚/达尔文

根据 http://developer.android.com/reference/android/text/format/Time.html,您应该使用 Time.getCurrentTimezone ()来检索设备的当前时区。

我需要的 偏移,不仅包括日光节约时间,但作为一个 数字。以下是我在有人需要示例时使用的代码。

我得到了 “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);

具有简单日期格式的最简单解决方案: 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

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

它会像

Asia/Kolkata

对于 API 26或更高版本的设备,你可以这样做:

ZonedDateTime.now().getZone().toString();

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

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

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

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

这里的所有答案似乎都建议将日光参数设置为 假的。这对于许多时区来说是不正确的,因为这些时区会根据一年中的时间来改变缩写名称(例如,EST美国东部时间)。

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

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

来自 java.time 和 Three TenABP 的 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年提出这个问题时得到的答案,尽管它的设计很糟糕。今天,它早已过时,我建议我们使用 Java.time,这是2014年出现的现代 Java 日期和时间 API。

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

Time 在旧的和新的 Android 设备上都能很好地工作,只是需要至少 爪哇6

  • 在 Java8以及更新的 Android 设备上(从 API 级别26开始) ,现代的 API 是内置的。
  • 在非 Android 的 Java6和 Java7中获得 Three Ten Backport,这是现代类的 Backport (ThreeTen 用于 JSR 310; 请参阅底部的链接)。
  • 编辑: 在(旧版) Android 平台上,只要你使用的是 Android Gradle 插件4.0或更新的版本,使用 coreLibraryDesugaring,你就可以直接使用 java.time。不再需要3TenABP。(上一条: 使用安卓版的 ThreeTen Backport。它叫做3TenABP。并确保从 org.threeten.bp导入带有子包的日期和时间类。)

连结