4

私は最近タイムゾーンの変換に取り組んでおり、得られた結果に非常に驚いています。基本的に、日付をあるタイムゾーンから別のタイムゾーンに変換したいと考えています。以下はコードで、変換は正常に機能していますが、デバッグ中に観察したことは、を呼び出さない限り日付が変換されないことCalendar#get(Calendar.FIELD)です。

    private static void convertTimeZone(String date, String time, TimeZone fromTimezone, TimeZone toTimeZone){
        Calendar cal = Calendar.getInstance(fromTimezone);
        String[] dateSplit = null;
        String[] timeSplit = null;
        if(time !=null){
            timeSplit = time.split(":");
        }
        if(date!=null){
            dateSplit = date.split("/");
        }
        if(dateSplit !=null){
            cal.set(Calendar.DATE, Integer.parseInt(dateSplit[0]));
            cal.set(Calendar.MONTH, Integer.parseInt(dateSplit[1])-1);
            cal.set(Calendar.YEAR, Integer.parseInt(dateSplit[2]));
        }
        if(timeSplit !=null){
            cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeSplit[0]));
            cal.set(Calendar.MINUTE, Integer.parseInt(timeSplit[1]));

        }
//      System.out.println("Time in " + fromTimezone.getDisplayName() + " : " + cal.get(Calendar.DATE) +"/"+ (cal.get(Calendar.MONTH)+1)+"/"+ cal.get(Calendar.YEAR) +" " + ((cal.get(Calendar.HOUR_OF_DAY)<10) ? ("0"+cal.get(Calendar.HOUR_OF_DAY) ): (cal.get(Calendar.HOUR_OF_DAY)))
//              +":" + (cal.get(Calendar.MINUTE)<10 ? "0"+cal.get(Calendar.MINUTE) : cal.get(Calendar.MINUTE)) );
        cal.setTimeZone(toTimeZone);
        System.out.println("Time in " + toTimeZone.getDisplayName() + " : " + cal.get(Calendar.DATE) +"/"+ (cal.get(Calendar.MONTH)+1)+"/"+ cal.get(Calendar.YEAR) +" " + ((cal.get(Calendar.HOUR_OF_DAY)<10) ? ("0"+cal.get(Calendar.HOUR_OF_DAY) ): (cal.get(Calendar.HOUR_OF_DAY)))
                +":" + (cal.get(Calendar.MINUTE)<10 ? "0"+cal.get(Calendar.MINUTE) : cal.get(Calendar.MINUTE)) );
}

public static void main(String[] args) throws ParseException {

        convertTimeZone("23/04/2013", "23:00", TimeZone.getTimeZone("EST5EDT"), TimeZone.getTimeZone("GB"));
    }

期待される出力: Time in Greenwich Mean Time : 24/4/2013 04:00

sysout 1 にコメントしたときに得た出力: Time in Greenwich Mean Time : 23/4/2013 23:00

sysout1 のコメントを外すと、期待される有効な出力が得られます。

どんな助けでも大歓迎です

4

5 に答える 5

2

答えは、次のコメント付きセクションでsetTimeZone()部分的に説明されています。

呼び出しのシーケンスを考えてみましょう: cal.setTimeZone(EST); cal.set(時間、1); cal.setTimeZone(PST)。cal は EST の 1 時または PST の 1 時に設定されていますか? 答え: PST. より一般的には、setTimeZone() への呼び出しは、set() への呼び出しの前後に、complete() への次の呼び出しまで影響を与えます。

つまり、シーケンス

  1. カレンダーの時刻を設定する
  2. タイムゾーンを変更

は、「この新しいタイム ゾーンでこの時間を使用する」を意味すると解釈されますが、シーケンスは

  1. カレンダーの時刻を設定する
  2. 時間 (またはその一部) を取得する
  3. タイムゾーンの変更

「今回は古いタイムゾーンで使用してから、変更してください」と解釈されます。

したがって、あなたの場合、希望する動作を得るには、タイムゾーンを変更する前に、または内部get()で呼び出す他のメソッドを呼び出す必要があります。complete()Calendar

于 2013-04-23T15:58:17.173 に答える
0

TimeZone と Calendar の使用に制限されていますか? そうでない場合は、タイムゾーンの処理がはるかに簡単になる優れた Library JodaTimeを使用することをお勧めします。

例は次のようになります。

public static void convertTimeZoneJoda(String date, String time, DateTimeZone fromTimezone, DateTimeZone toTimeZone) {
    DateTimeFormatter dtf = DateTimeFormat.forPattern("dd/MM/yyyyHH:mm").withZone(fromTimezone);
    DateTime dt = dtf.parseDateTime(date+time).withZone(toTimeZone);

    System.out.println("Time in " + toTimeZone.getID() + " : " + dt.toString());
}

public static void main(String[] args) {
    convertTimeZoneJoda("23/04/2013", "23:00", DateTimeZone.forID("EST5EDT"), DateTimeZone.forID("GMT"));
}

JodaTime は、TimeZone と DateTimeZone の間の便利な会話も可能にします。

于 2013-04-23T15:47:23.967 に答える
0

このコードは、UTC に変換するために機能します。

  1. UTC タイム ゾーンで Calendar オブジェクトを作成する

    Calendar utcTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    
  2. 「任意のタイム ゾーン」Calendar オブジェクトから UTC Calendar オブジェクトの特定の時点を設定します

    utcTime.setTimeInMillis(myCalendarObjectInSomeOtherTimeZone.getTimeInMillis());
    
  3. utcTimemyCalendarObjectInSomeOtherTimeZoneUTC に変換された時点と同じ時点が含まれるようになりました。

于 2016-09-21T23:10:27.487 に答える