当我点击一个按钮时,我想从 Android 手机上获得时区信息。
你曾否尝试使用 TimeZone.getDefault():
TimeZone.getDefault()
大多数应用程序将使用返回基于 在程序运行的时区上。
档号: http://developer.android.com/reference/java/util/TimeZone.html
编辑: 纠正案例
试试这个密码
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)
现代答案:
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。
TimeZone
Time 在旧的和新的 Android 设备上都能很好地工作,只是需要至少 爪哇6。
coreLibraryDesugaring
org.threeten.bp
java.time