web-dev-qa-db-ja.com

TimeZone名なしでTimeZoneからTimeZoneオフセット値を取得します

電話のタイムゾーンを[+/-] hh:mmの形式で保存する必要があります

これに対処するためにTimeZoneクラスを使用していますが、取得できる唯一の形式は次のとおりです。

PST -05:00
GMT +02:00

結果を部分文字列にしたくないのですが、そのタイムゾーンの名前(GMT/CET/PST ...)ではなく値のみを取得するように設定できるキーまたはオプションフラグはありますか?

48
Mr Bean

電話のタイムゾーンを[+/-] hh:mmの形式で保存する必要があります

いいえ、あなたはしません。オフセットだけでは十分ではないため、タイムゾーン名/ ID全体を保存する必要があります。たとえば、現在のオフセットが+02:00であるオスロに住んでいますが、冬( dst のため)は+01:00です。標準時間と夏時間の正確な切り替えは、探索したくない要因によって異なります。

したがって、_+ 02:00_を格納する代わりに(または_+ 01:00_にすべきですか?)データベースに_"Europe/Oslo"_を格納します。これで、次を使用して完全な構成を復元できます。

_TimeZone tz = TimeZone.getTimeZone("Europe/Oslo")
_

今日の私のタイムゾーンオフセットを知りたいですか?

_tz.getOffset(new Date().getTime()) / 1000 / 60   //yields +120 minutes
_

ただし、12月も同じです。

_Calendar christmas = new GregorianCalendar(2012, DECEMBER, 25);
tz.getOffset(christmas.getTimeInMillis()) / 1000 / 60   //yields +60 minutes
_

つまり、タイムゾーン名またはIDを保存し、日付を表示するたびに、固定値を保存するのではなく、現在のオフセット(今日)を確認します。 TimeZone.getAvailableIDs() を使用して、サポートされているすべてのタイムゾーンIDを列挙できます。

84

@MrBean-サードパーティのWebサービスを呼び出して、Androidデバイスの現在のタイムゾーンオフセットを+/- hh:mmの形式で渡す必要がありました。私の解決策:

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;
} 
68
PuguaSoft

Java8では、次を使用できます

Integer offset  = ZonedDateTime.now().getOffset().getTotalSeconds();

uTCから現在のシステム時間オフセットを取得します。その後、必要な形式に変換できます。それは私の場合に便利だとわかりました。例: https://docs.Oracle.com/javase/tutorial/datetime/iso/timezones.html

5
voidMainReturn
ZoneId here = ZoneId.of("Europe/Kiev");
ZonedDateTime hereAndNow = Instant.now().atZone(here);
String.format("%tz", hereAndNow);

「+0300」のような標準化された文字列表現を提供します

TimeZoneインスタンスとSystem.currentTimeMillis()のみでTimeZoneのミリ秒オフセットを簡単に取得できます。次に、TimeUnitクラスを使用して、ミリ秒から任意の時間単位に変換できます。

そのようです:

public static int getOffsetHours(TimeZone timeZone) {
    return (int) TimeUnit.MILLISECONDS.toHours(timeZone.getOffset(System.currentTimeMillis()));
}

または、新しいJava 8時間API

public static ZoneOffset getOffset(TimeZone timeZone) { //for using ZoneOffsett class
    ZoneId zi = timeZone.toZoneId();
    ZoneRules zr = zi.getRules();
    return zr.getOffset(LocalDateTime.now());
}

public static int getOffsetHours(TimeZone timeZone) { //just hour offset
    ZoneOffset zo = getOffset(timeZone);
    TimeUnit.SECONDS.toHours(so.getTotalSeconds());
}
1
MeetTitan

私はこれが古いことを知っていますが、自分の意見を述べたいと思いました。私は仕事でプロジェクトのためにこれをしなければならなかった、これは私の解決策だった。

TimeZoneクラスを使用してTimezoneを含むBuildingオブジェクトがあり、新しいクラスでzoneIdフィールドとoffsetフィールドを作成したかった。

だから私がしたことは作成した:

private String timeZoneId;
private String timeZoneOffset;

次に、コンストラクターでBuildingオブジェクトを渡し、これらのフィールドを次のように設定します。

this.timeZoneId = building.getTimeZone().getID();
this.timeZoneOffset = building.getTimeZone().toZoneId().getId();

したがって、timeZoneIdは「EST」のようなものになり、timeZoneOffsetは「-05:00」のようなものになります。

私はあなたがそうしないかもしれないことをしたくない

1
Crislips