web-dev-qa-db-ja.com

AndroidデバイスからGMT(GMT + 7:00など)のタイムゾーンオフセットを取得する方法?

このコードを使用してAndroidデバイスのtimezoneを取得しています

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

しかし、それは常に「timezone」のようなISTを返しますが、GMTのタイムゾーンを取得したいGMT+7:00.

44
Naveen Kumar

このコードは、GMTオフセットを返します。

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

次のようなタイムゾーンオフセットを返します。+ 05

以下のSimpleDateFormatを使用する場合

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

次のようなタイムゾーンオフセットを返します。GMT + 05:

50
Naveen Kumar

これはあなたの好みにそれを実装する方法についてのアイデアを与えるかもしれません:

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」です)

71
kaderud

GMT + 05:この形式でタイムゾーンオフセットを取得するソリューションを次に示します。

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;
}
22
Yog Guru
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:のような結果を返します

15
XXX

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

11
Felipe Duarte
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;
}
7
PuguaSoft
 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;
5
KOUSIK daniel

タイムゾーンオフセットを取得するさらに別のソリューション:

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);
}
5
Roman Lutsenko
TimeZone timeZone = TimeZone.getDefault();
String timeZoneInGMTFormat = timeZone.getDisplayName(false,TimeZone.SHORT);

出力:GMT + 5:30

4
Rajat Mehra

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;
4
MikeL

このようにすることができます:

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

    String timeZone = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60);
3
Franzé Jr.

これは、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()

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

これが役立つかどうかを確認してください:)

2
sachinsharma

ZoneDateTimeクラスを使用して、Java8(Android以外)でこのための簡単なソリューションを見つけました。動作するTemporalAccessorインターフェースを実装する他のクラスがあるかもしれませんが、私はそれらを見つけていません。これは、私の知る限り、標準のDateDateTimeLocalDateTime、およびCalenderクラスでは機能しません。

    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"

このソリューションの素晴らしい点は、多くのモジュロ演算、文字列生成、解析を回避できることです。

2
saarp

通常、Asia/Kolkataなどのタイムゾーンから+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

デフォルトのタイムゾーンでは、zoneZoneId.systemDefault()に設定します。

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

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

GMT + 05:30

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

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

はい、Java.timeは古いものと新しいものでうまく動作しますAndroidデバイス。少なくともJava 6が必要です。

  • Java 8以降および新しいAndroidデバイス(APIレベル26以降)では、最新のAPIが組み込まれています。
  • Java 6および7は、モダンクラスのバックポートであるThreeTenバックポートを取得します(JSR 310のスリーテン。下部のリンクを参照)。
  • On(古い)Android Android ThreeTen Backportのエディションを使用します。ThreeTenABPと呼ばれます。そして、サブパッケージでorg.threeten.bpから日時クラスをインポートしてください。

リンク集

1
Ole V.V.

私もこれを見て、タイムゾーンと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;
}

これはうまくいくようですが、ユーザーにとって意味のある正確な時間を表す実際の時間をデバイスから取得するより良い方法はありますか?

1
Darnst

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;
1
Ravi Kumar

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
0
Wajid Ali

次のコードを使用します(Opt 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
0
Artificioo

ここからこの関数からカスタム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);
    }
0
pavel