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

1行の解決策は、次の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 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 に答える
5
TimeZone timeZone = TimeZone.getDefault();
String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT);

出力:GMT + 5:30

于 2017-08-22T15:17:19.253 に答える
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)、オフセットは年に2回変更されます。

ただし、ある時点を指定すると、その特定の時点の翻訳を行うことができます。私はそれを行うための現代的な方法を提供したいと思います。

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

デフォルトのタイムゾーンは。に設定さzoneれていZoneId.systemDefault()ます。

オフセットをテキストでフォーマットするには、パターンに(4つの大文字O)をGMT含むフォーマッターを使用します。OOOO

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

GMT + 05:30

私は推奨しており、コードでは最新のJava日時APIであるjava.timeを使用しています。他の多くの回答で使用されている、、、、およびクラスはTimeZone、設計が不十分で、現在は古くなっているため、これらすべてを回避することをお勧めします。CalendarDateSimpleDateFormatDateFormat

質問:Androidでjava.timeを使用できますか?

はい、java.timeは古いAndroidデバイスと新しいAndroidデバイスでうまく機能します。少なくともJava6が必要です。

  • Java 8以降および新しいAndroidデバイス(APIレベル26以降)では、最新のAPIが組み込まれています。
  • Java 6および7では、最新のクラスのバックポートであるThreeTenバックポートを取得します(JSR 310の場合はThreeTen。下部のリンクを参照してください)。
  • (古い)Androidでは、Android版のThreeTenBackportを使用します。それは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以外)でこのための簡単な解決策を見つけましたZoneDateTimeTemporalAccessor動作するインターフェースを実装する他のクラスがあるかもしれませんが、私はそれらを見つけていません。これは、私が知る限り、標準、、、およびクラスでは機能しませ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 に答える