如何从Android设备获得GMT(如GMT + 7:00)的时区偏移量?

Nav*_*mar 46 timezone android

我正在timezone使用此代码获取Android设备

TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = (TimeZone.getTimeZone(tz.getID()).getDisplayName(
                false, TimeZone.SHORT))
Run Code Online (Sandbox Code Playgroud)

但它总是让我timezone像" IST",但我想得到GMT像这样的时区GMT+7:00.

kad*_*rud 73

这可能会让您了解如何根据自己的喜好实现它:

Calendar mCalendar = new GregorianCalendar();  
TimeZone mTimeZone = mCalendar.getTimeZone();  
int mGMTOffset = mTimeZone.getRawOffset();  
System.out.printf("GMT offset is %s hours", TimeUnit.HOURS.convert(mGMTOffset, TimeUnit.MILLISECONDS)); 
Run Code Online (Sandbox Code Playgroud)

(TimeUnit是"java.util.concurrent.TimeUnit")

  • 这个答案是*不正确.rawOffset不考虑夏令时.要获得所需的"真实"偏移量:Calendar mCalendar = new GregorianCalendar(); TimeZone mTimeZone = mCalendar.getTimeZone(); int mGMTOffset = mTimeZone.getRawOffset()+(mTimeZone.inDaylightTime(new Date())?mTimeZone.getDSTSavings():0); (17认同)
  • 我只想指出,如果你正在寻找包括夏令时的精确偏移,你应该使用mTimeZone.getOffset(currentTime). (3认同)

Nav*_*mar 52

此代码返回GMT偏移量.

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.getDefault());
Date currentLocalTime = calendar.getTime();
DateFormat date = new SimpleDateFormat("Z");
String localTime = date.format(currentLocalTime);
Run Code Online (Sandbox Code Playgroud)

它返回时区偏移量,如下所示:+0530

如果我们在下面使用SimpleDateFormat

DateFormat date = new SimpleDateFormat("z",Locale.getDefault());
String localTime = date.format(currentLocalTime);
Run Code Online (Sandbox Code Playgroud)

它返回时区偏移量,如下所示:GMT + 05:30

  • 这在使用Android 7.1(牛轧糖)的Samsung s7中不起作用,它重新调谐* IST *而不是* GMT + 05:30 *在较低版本中正常工作。 (2认同)
  • 可以确认......而不是“GMT+01:00”我得到“MEZ”......为什么这是如此荒谬的复杂 (2认同)

Yog*_*uru 24

这是一种解决方案,以GMT + 05:30格式获取时区偏移量

public String getCurrentTimezoneOffset() {

    TimeZone tz = TimeZone.getDefault();  
    Calendar cal = GregorianCalendar.getInstance(tz);
    int offsetInMillis = tz.getOffset(cal.getTimeInMillis());

    String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
    offset = "GMT"+(offsetInMillis >= 0 ? "+" : "-") + offset;

    return offset;
}
Run Code Online (Sandbox Code Playgroud)


XXX*_*XXX 16

public static String timeZone()
{
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.getDefault());
    String   timeZone = new SimpleDateFormat("Z").format(calendar.getTime());
    return timeZone.substring(0, 3) + ":"+ timeZone.substring(3, 5);
}
Run Code Online (Sandbox Code Playgroud)

返回 +03:30


Fel*_*rte 11

一行解决方案是使用如下Z符号:

new SimpleDateFormat(pattern, Locale.getDefault()).format(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)

哪里pattern可能是:

  • Z/ZZ/ZZZ:-0800
  • ZZZZ:GMT-08:00
  • ZZZZZ:-08:00

完整参考:

http://developer.android.com/reference/java/text/SimpleDateFormat.html

  • 最优解 (2认同)

Pav*_*vel 9

这就是 Google 建议获取 TimezoneOffset 的方式。

Calendar calendar = Calendar.getInstance(Locale.getDefault());
int offset = -(calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / (60 * 1000)
Run Code Online (Sandbox Code Playgroud)

https://developer.android.com/reference/java/util/Date#getTimezoneOffset()


小智 7

public static String getCurrentTimezoneOffset() {

    TimeZone tz = TimeZone.getDefault();  
    Calendar cal = GregorianCalendar.getInstance(tz);
    int offsetInMillis = tz.getOffset(cal.getTimeInMillis());

    String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
    offset = (offsetInMillis >= 0 ? "+" : "-") + offset;

    return offset;
}
Run Code Online (Sandbox Code Playgroud)


KOU*_*iel 5

 TimeZone tz = TimeZone.getDefault();  
Calendar cal = GregorianCalendar.getInstance(tz);
int offsetInMillis = tz.getOffset(cal.getTimeInMillis());

String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
Run Code Online (Sandbox Code Playgroud)


小智 5

获得时区偏移的另一种解决方案:

TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = getGmtOffsetString(tz.getRawOffset());

public static String getGmtOffsetString(int offsetMillis) {
    int offsetMinutes = offsetMillis / 60000;
    char sign = '+';
    if (offsetMinutes < 0) {
        sign = '-';
        offsetMinutes = -offsetMinutes;
    }
    return String.format("GMT%c%02d:%02d", sign, offsetMinutes/60, offsetMinutes % 60);
}
Run Code Online (Sandbox Code Playgroud)


Raj*_*hra 5

TimeZone timeZone = TimeZone.getDefault();
String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT);
Run Code Online (Sandbox Code Playgroud)

输出:GMT+5:30

  • 这仅返回 IST。不是格林威治标准时间 + 5:30 (3认同)

Ole*_*.V. 5

一般来说,您无法从亚洲/加尔各答等时区转换为 GMT 偏移量(如 +05:30 或 +07:00)。时区,顾名思义,是地球上的一个地方,由该地方的人们使用的历史的、现在的和已知的未来的 UTC 偏移量组成(目前我们可以将 GMT 和 UTC 视为同义词,严格来说它们不是) 。例如,自 1945 年以来,亚洲/加尔各答的偏移量一直为 +05:30。在 1941 年至 1945 年期间,偏移量为 +06:30,在此之前的偏移量为 +05:53:20(是的,精确到秒)。许多其他时区都有夏令时(夏令时,DST),并且每年更改两次偏移量。

\n\n

不过,给定一个时间点,我们可以针对该特定时间点进行翻译。我想提供一种现代的方法来做到这一点。

\n\n

java.time 和 ThreeTenABP

\n\n
    ZoneId zone = ZoneId.of("Asia/Kolkata");\n\n    ZoneOffset offsetIn1944 = LocalDateTime.of(1944, Month.JANUARY, 1, 0, 0)\n            .atZone(zone)\n            .getOffset();\n    System.out.println("Offset in 1944: " + offsetIn1944);\n\n    ZoneOffset offsetToday = OffsetDateTime.now(zone)\n            .getOffset();\n    System.out.println("Offset now: " + offsetToday);\n
Run Code Online (Sandbox Code Playgroud)\n\n

刚才运行时的输出是:

\n\n
\n
Offset in 1944: +06:30\nOffset now: +05:30\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

对于默认时区设置zoneZoneId.systemDefault()

\n\n

要使用文本格式化偏移量,请在模式中GMT使用带有(四个大写字母 O)的格式化程序:OOOO

\n\n
    DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("OOOO");\n    System.out.println(offsetFormatter.format(offsetToday));\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

格林威治标准时间+05:30

\n
\n\n

我推荐并在我的代码中使用 java.time,现代 Java 日期和时间 API。许多其他答案中使用的TimeZoneCalendarDate和类设计得很糟糕SimpleDateFormatDateFormat而且现在已经过时了,所以我的建议是避免所有这些。

\n\n

问:我可以在 Android 上使用 java.time 吗?

\n\n

是的,java.time 在旧版和新版 Android 设备上都能很好地工作。它只需要至少Java 6

\n\n
    \n
  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • \n
  • 在 Java 6 和 7 中,获得 ThreeTen Backport,即现代类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • \n
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它\xe2\x80\x99s 称为ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。
  • \n
\n\n

链接

\n\n\n