61

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

TimeZone tz = TimeZone.getDefault();
String current_Time_Zone = (TimeZone.getTimeZone(tz.getID()).getDisplayName(
                false, TimeZone.SHORT))

但它总是timezone像“ ”一样返回我,但我想像这样IST获得时区GMTGMT+7:00.

4

23 回答 23

83

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

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

(TimeUnit 是“java.util.concurrent.TimeUnit”)

于 2013-02-25T14:07:14.243 回答
64

此代码返回我 GMT 偏移量。

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

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

如果我们在下面使用 SimpleDateFormat

DateFormat date = new SimpleDateFormat("z",Locale.getDefault());
String localTime = date.format(currentLocalTime);

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

于 2013-02-26T09:00:48.923 回答
28

这是以 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;
}
于 2015-02-24T11:52:18.907 回答
21
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);
}

返回像 +03:30

于 2013-11-16T19:16:37.820 回答
18

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

new SimpleDateFormat(pattern, Locale.getDefault()).format(System.currentTimeMillis());

pattern可能在哪里:

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

完整参考这里:

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

于 2016-03-21T17:57:52.950 回答
10

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

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

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

于 2018-09-08T06:47:33.083 回答
8
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;
}
于 2013-05-21T22:29:30.423 回答
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;
于 2015-07-31T12:09:36.717 回答
5
TimeZone timeZone = TimeZone.getDefault();
String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT);

输出:GMT+5:30

于 2017-08-22T15:17:19.253 回答
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);
}
于 2015-08-11T13:26:05.883 回答
4

如果有人正在寻找如何将 GMT 表示为表示小时偏移量的浮点数
(例如“GMT-0530”到 -5.5),您可以使用以下命令:

Calendar calendar = new GregorianCalendar();
TimeZone timeZone = calendar.getTimeZone();
int offset = timeZone.getRawOffset();
long hours = TimeUnit.MILLISECONDS.toHours(offset);
float minutes = (float)TimeUnit.MILLISECONDS.toMinutes(offset - TimeUnit.HOURS.toMillis(hours)) / MINUTES_IN_HOUR;
float gmt = hours + minutes;
于 2015-01-13T10:28:20.313 回答
3

你可以这样做:

    TimeZone tz = TimeZone.getDefault();
    int offset = tz.getRawOffset();

    String timeZone = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60);
于 2015-04-21T02:28:00.123 回答
3

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

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

java.time 和 ThreeTenABP

    ZoneId zone = ZoneId.of("Asia/Kolkata");

    ZoneOffset offsetIn1944 = LocalDateTime.of(1944, Month.JANUARY, 1, 0, 0)
            .atZone(zone)
            .getOffset();
    System.out.println("Offset in 1944: " + offsetIn1944);

    ZoneOffset offsetToday = OffsetDateTime.now(zone)
            .getOffset();
    System.out.println("Offset now: " + offsetToday);

刚才运行时的输出是:

Offset in 1944: +06:30
Offset now: +05:30

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

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

    DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("OOOO");
    System.out.println(offsetFormatter.format(offsetToday));

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

我推荐并在我的代码中使用 java.time,这是现代 Java 日期和时间 API。许多其他答案中使用的TimeZoneCalendarDateSimpleDateFormatDateFormat设计不佳,现在早已过时,所以我的建议是避免所有这些。

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

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少Java 6

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

链接

于 2019-07-22T11:31:05.280 回答
2
TimeZone tz = TimeZone.getDefault();  
String gmt1=TimeZone.getTimeZone(tz.getID())
      .getDisplayName(false,TimeZone.SHORT);  
String gmt2=TimeZone.getTimeZone(tz.getID())
      .getDisplayName(false,TimeZone.LONG); Log.d("Tag","TimeZone : "+gmt1+"\t"+gmt2);

看看这是否有帮助:)

于 2013-02-25T13:36:03.510 回答
2

我在 Java8(非 Android)中使用ZoneDateTime该类偶然发现了一个简单的解决方案。可能还有其他实现该TemporalAccessor接口的类,但我还没有找到它们。据我所知,这不适用于标准Date、、和类。DateTimeLocalDateTimeCalender

    ZoneOffset myOffset = ZonedDateTime.now().getOffset();
    ZoneOffset myOffset2 = ZoneOffset.from(ZonedDateTime.now());
    log.info("ZoneOffset is " + myOffset.getId());  // should print "+HH:MM"
    log.info("ZoneOffset2 is " + myOffset2.getId());  // should print "+HH:MM"

这个解决方案的好处是它避免了很多模数学、字符串生成和解析。

于 2016-05-20T23:52:07.990 回答
2

您可以从此处从此功能获取自定义 GMT 时间

  public static String getCurrentDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd hh:mm a zzz");
        Date date = new Date();
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+6:00"));
        return sdf.format(date);
    }
于 2019-07-22T11:11:20.637 回答
1

我也一直在研究这个并试图弄清楚如何应用时区和 DST。这是我的代码。

    public long applyGMTOffsetDST(long time) {
    // Works out adjustments for timezone and daylight saving time

    Calendar mCalendar = new GregorianCalendar();  
    TimeZone mTimeZone = mCalendar.getTimeZone();  
    boolean dstBool = mTimeZone.getDefault().inDaylightTime( new Date() );
    // add an hour if DST active

    if (dstBool == true) {
        time = time + secondsPerHour;
    }
    // add offest hours
    int mGMTOffset = mTimeZone.getRawOffset();

    if (mGMTOffset > 0) {
        long offsetSeconds = secondsPerHour * mGMTOffset;
        time = time + offsetSeconds;
    }

    return time;
}

这似乎可行,但有没有更好的方法来获取设备的实际时间,这代表对用户有意义且准确的时间?

于 2013-09-17T19:28:35.857 回答
1

添加 dst 偏移量将解决此问题:

    int offsetInMillis = TimeZone.getDefault().getRawOffset()+TimeZone.getDefault().getDSTSavings();
    String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
    offset = (offsetInMillis >= 0 ? "+" : "-") + offset;
    return offset;
于 2018-06-19T07:20:55.317 回答
1

使用此代码(选项 1):

    //Opt 1
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
            Locale.getDefault());
    Date currentLocalTime = calendar.getTime();
    DateFormat date = new SimpleDateFormat("Z", Locale.getDefault());
    String localTime = date.format(currentLocalTime);
    String finalTimezone = String.format("GMT%s:%s", localTime.substring(0, 3), localTime.substring(3));
    Log.d(TAG, "timezone 1: " + finalTimezone);

    //Opt 2
    date = new SimpleDateFormat("z",Locale.getDefault());
    localTime = date.format(currentLocalTime);
    Log.d(TAG, "timezone 2: "+localTime);

    //Opt 3
    TimeZone tz = TimeZone.getDefault();
    Log.d(TAG, "timezone 3: "+tz.getDisplayName(true, TimeZone.SHORT));
    //

如果我在洛杉矶(GTM-07:00 太平洋标准时间),则输出为:

timezone 1: GMT-07:00
timezone 2: PDT
timezone 3: PDT
于 2019-06-13T19:07:48.257 回答
1

要获取带有偏移量的日期时间,2019-07-22T13:39:27.397+05:00 请尝试遵循 Kotlin 代码:

fun getDateTimeForApiAsString() : String{
    val date = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", 
                   Locale.getDefault())
    return date.format(Date())
}

输出格式:

2019-07-22T13:39:27.397+05:00 //for Pakistan

如果您想要其他类似的格式替换模式SimpleDateFormat如下:

"yyyy.MM.dd G 'at' HH:mm:ss z"  //Output Format: 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"  //Output Format:    Wed, Jul 4, '01
"h:mm a"      //Output Format: 12:08 PM
"hh 'o''clock' a, zzzz"   //Output Format:  12 o'clock PM, Pacific Daylight Time
"K:mm a, z"  //Output Format:   0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"  //Output Format:    02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"  //Output Format:  Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"  //Output Format:   010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"  //Output Format:  2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"  //Output Format:    2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"  //Output Format:    2001-W27-3
于 2019-07-22T09:31:38.933 回答
0

我有一个正确的方法:</p>

public static String getCurrentTimeZone() {
    TimeZone timeZone = TimeZone.getDefault();
    return createGmtOffsetString(true, true, timeZone.getRawOffset());
}

public static String createGmtOffsetString(boolean includeGmt,
                                           boolean includeMinuteSeparator, int offsetMillis) {
    int offsetMinutes = offsetMillis / 60000;
    char sign = '+';
    if (offsetMinutes < 0) {
        sign = '-';
        offsetMinutes = -offsetMinutes;
    }
    StringBuilder builder = new StringBuilder(9);
    if (includeGmt) {
        builder.append("GMT");
    }
    builder.append(sign);
    appendNumber(builder, 2, offsetMinutes / 60);
    if (includeMinuteSeparator) {
        builder.append(':');
    }
    appendNumber(builder, 2, offsetMinutes % 60);
    return builder.toString();
}

private static void appendNumber(StringBuilder builder, int count, int value) {
    String string = Integer.toString(value);
    for (int i = 0; i < count - string.length(); i++) {
        builder.append('0');
    }
    builder.append(string);
}
于 2021-03-16T01:29:37.583 回答
0

您可以获得格式为 +01:00 的时区偏移量,但有以下两个

  1. 对于 API 级别 24+,请使用XXX
  2. 对于 API 级别 24 或更低,请使用ZZZZZ

得到这样的结果:2011-12-03T10:15:30+01:00

你所要做的 :

对于 API 级别 24+ ,请使用“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX

对于低于 24 的 API 级别,请使用“ yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ

于 2022-03-03T17:48:33.437 回答
-1

我为自己找到的最佳解决方案

SimpleDateFormat("XXX", Locale.getDefault()).format(System.currentTimeMillis())

+03:00

您可以尝试更改模式(“xxx”字符串)以获得您想要的结果,例如:

SimpleDateFormat("XX", Locale.getDefault()).format(System.currentTimeMillis())

+0300

SimpleDateFormat("X", Locale.getDefault()).format(System.currentTimeMillis())

+03

图案也可以应用其他字母,结果会有所不同

SimpleDateFormat("Z", Locale.getDefault()).format(System.currentTimeMillis())

+0300

有关此的更多信息,您可以在此处找到:https ://developer.android.com/reference/java/text/SimpleDateFormat.html

于 2020-03-26T10:55:00.427 回答