電話のタイムゾーンを[+/-] hh:mmの形式で保存する必要があります
これに対処するためにTimeZoneクラスを使用していますが、取得できる唯一の形式は次のとおりです。
PST -05:00
GMT +02:00
結果を部分文字列にしたくないのですが、そのタイムゾーンの名前(GMT/CET/PST ...)ではなく値のみを取得するように設定できるキーまたはオプションフラグはありますか?
電話のタイムゾーンを[+/-] 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を列挙できます。
@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;
}
Java8では、次を使用できます
Integer offset = ZonedDateTime.now().getOffset().getTotalSeconds();
uTCから現在のシステム時間オフセットを取得します。その後、必要な形式に変換できます。それは私の場合に便利だとわかりました。例: https://docs.Oracle.com/javase/tutorial/datetime/iso/timezones.html
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());
}
私はこれが古いことを知っていますが、自分の意見を述べたいと思いました。私は仕事でプロジェクトのためにこれをしなければならなかった、これは私の解決策だった。
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」のようなものになります。
私はあなたがそうしないかもしれないことをしたくない