17

2013 年 1 月 20 日、2012 年 8 月 8 日などの形式で、独自のタイムゾーンを持つ日付があります。たとえば、2013 年 1 月 20 日のタイムゾーン ID はオーストラリア/メルボルン、2012 年 8 月 8 日のタイムゾーン ID はヨーロッパ/ロンドンなどです。私がやりたいことは、これらのタイムゾーンと日付に基づいて、指定された日付のそのタイムゾーンの UTC オフセットを計算することです。私はこれまでにこれを思いつきました:

DateTimeFormatter dtf = DateTimeFormat.forPattern("ZZ");
DateTimeFormatter dtf1 = DateTimeFormat.forPattern("ddMMMYYYY");

DateTimeZone zone = DateTimeZone.forID("Australia/Melbourne");  

DateTime thisDate = dtf1.parseDateTime("30Jul2013");                                            
System.out.println("\nZone: " + thisDate.withZone(zone));

これにより、出力が得られます。

Zone: 2013-07-30T00:00:00.000+10:00

これは正しいですが、ここから UTC オフセット (この場合は +10:00) だけを抽出したいと思います。これを行う方法を探しましたが、何も見つかりません。これを行う方法はありますか?私が見る唯一のオプションは、出力を文字列に変換し、部分文字列メソッドを使用して UTC オフセットを取得することです。

上記のコードでは、DST (夏時間) が考慮されています。たとえば、次のような場合: DateTime thisDate = dtf1.parseDateTime("30Jan2013");

出力は次のようになります: 2013-01-30T00:00:00.000+11:00

(+10:00 ではなく、最後に +11:00)

したがって、基本的に必要なことは、2013-07-30T00:00:00.000+11:00 から +11:00 を抽出する方法を見つけることだけです。助けてください!

4

5 に答える 5

15

タイムゾーン名と時差を取得する簡単な方法

public static String getCurrentTimeZoneOffset() {
    DateTimeZone tz = DateTimeZone.getDefault();
    Long instant = DateTime.now().getMillis();

    String name = tz.getName(instant);

    long offsetInMilliseconds = tz.getOffset(instant);
    long hours = TimeUnit.MILLISECONDS.toHours( offsetInMilliseconds );
    String offset = Long.toString( hours );

    return name + " (" + offset + " Hours)";
    // Example: "Mountain Standard Time (-7 Hours)"
}

カップルの注意事項:

  • これはJodaTimeDateTimeZoneからデフォルトを取得します。メソッドに渡される特定の DateTimeZone を受け入れるように変更できます。
  • これは " Mountain Standard Time (-7 Hours) "のような形式で返しますが、必要に応じて簡単に書式設定できます。

それが役立つことを願っています。

JP

于 2014-01-29T02:11:55.160 に答える
4

Joda が正しいオフセットを提供するには、datetime インスタントを指定する必要があります。datetime インスタントがないと、異なるオフセット (夏時間) があるため、オフセットを計算することはできません。これは、Joda を使用して + HH:mm 形式でオフセットを取得する方法です。

    int offsetInMillis = DateTimeZone.forID(zoneId).getOffset(new DateTime().getMillis());
    String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000),
            Math.abs((offsetInMillis / 60000) % 60));
    offset = (offsetInMillis >= 0 ? "+" : "-") + offset; 
于 2015-02-09T20:11:58.903 に答える
3

タイムゾーン オフセットだけが必要な場合は、 を使用DateTimeZone.forID()してタイム ゾーンをtz.getOffset(instant)取得してから、ミリ秒単位で UTC へのオフセットを取得します。

UTC へのオフセットを計算するために瞬時が必要なのは奇妙に思えるかもしれませんが、これはタイムゾーンの変更だけでなく夏時間も考慮する必要があります。はい、国によって時折タイムゾーンが変更されます。

タイムゾーン データが変更されるのはなぜですか?

タイムゾーンの設定はローカルで採用されており、世界のタイムゾーン機関はありません。

編集これにより、正しい結果が得られます。

    DateTimeFormatter dtf1 = DateTimeFormat.forPattern("ddMMMYYYY");

    DateTimeZone zone = DateTimeZone.forID("Australia/Melbourne");  

    DateTime thisDate = dtf1.parseDateTime("30Jul2013").withZone(zone);                                            
    assertEquals( 10 * CommonConstants.MILLISECONDS_PER_HOUR,
        zone.getOffset( thisDate ) );

thisDate.get

于 2013-01-30T11:18:44.193 に答える