Calendar.getInstance(TimeZone.getTimeZone(“ UTC”))がUTC時間を返さない


106

Calendar.getInstance(TimeZone.getTimeZone("UTC"))メソッド呼び出しで得られる結果に本当に混乱しています。IST時間を返しています。

これが私が使ったコードです

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

そして私が得た応答は:

Sat Jan 25 15:44:18 IST 2014

だから私はデフォルトのTimeZoneをUTCに変更してみました、そして私はチェックしました、そしてそれはそれがうまくいきます

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

TimeZone tz  = TimeZone.getDefault() ;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());
TimeZone.setDefault(tz);

結果:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014

ここで何か不足していますか?

回答:


146

System.out.println(cal_Two.getTime())呼び出しが返されますDateからgetTime()。のDate文字列に変換されるのはprintlnであり、その変換では、デフォルトのISTタイムゾーンが使用されます。

を目的のタイムゾーンでDateFormat.setTimeZone()印刷するにDateは、を明示的に使用する必要があります。

編集:@Laurynasの礼儀、これを考慮してください:

TimeZone timeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(timeZone);
SimpleDateFormat simpleDateFormat = 
       new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
simpleDateFormat.setTimeZone(timeZone);

System.out.println("Time zone: " + timeZone.getID());
System.out.println("default time zone: " + TimeZone.getDefault().getID());
System.out.println();

System.out.println("UTC:     " + simpleDateFormat.format(calendar.getTime()));
System.out.println("Default: " + calendar.getTime());

これをしばらく探していました。たぶん、タイトルがはっきりしていませんか?ちなみに、助けてくれてありがとう
gavard.e

3
System.out.printlnの結果を表示すれば、時間を大幅に節約できます:)
Vasil Valchev

1
私はこれを受け取ります。感謝します。しかし、タイムゾーン設定の設定がsimpleDateFormatクラスの責任である方法がわかりません。タイムゾーンを変更すると、形式ではなく実際の時刻が変更されます。SimpleDateFormatの仕事は、日付をフォーマットすることであり、時刻を操作することではありません
。...– angryITguy

完璧な答え!!
Najib Ahmed Puthawala

これにより(フォーマッターのタイムゾーンを設定する必要があります)、カレンダーのタイムゾーンを設定したとしても、毎回私を取得します。
Agi Hammerthief

17

java.util.Dateタイムゾーンとは無関係です。インスタンスのタイムゾーンがに設定されているcal_Twoにもかかわらず印刷CalendarするとUTC、タイムゾーンを持たない(常にデフォルトのタイムゾーンにある)インスタンスcal_Two.getTime()が返さDateれます。

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
System.out.println(cal_Two.getTimeZone());

出力:

 Sat Jan 25 16:40:28 IST 2014
    sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 

のjavadocから TimeZone.setDefault()

getDefaultメソッドによって返されるTimeZoneを設定します。ゾーンがnullの場合、デフォルトをVMが最初に起動したときの値にリセットします。

したがって、setDefault()前に移動するcal_Twoとインスタンス化され、正しい結果が得られます。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());

出力:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014

6
Calendar currentTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
currentTime.set(Calendar.ZONE_OFFSET, TimeZone.getTimeZone("UTC").getRawOffset());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, currentTime.get(Calendar.HOUR_OF_DAY));
calendar.getTimeInMillis()

私のために働いています


5

あなたは間違いなく小さなことを欠いています、そしてそれはあなたがデフォルト値を設定していないということです:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

したがって、コードは次のようになります。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

説明:タイムゾーンを変更する場合は、デフォルトのタイムゾーンを使用して設定しますTimeZone.setDefault()


0
    Following code is the simple example to change the timezone
public static void main(String[] args) {
          //get time zone
          TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Colombo");
          Calendar calendar = new GregorianCalendar();
          //setting required timeZone
          calendar.setTimeZone(timeZone1);
          System.out.println("Time :" + calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND));

       }

タイムゾーンのリストを表示したい場合は、次のコードをご覧ください

public static void main(String[] args) {

    String[] ids = TimeZone.getAvailableIDs();
    for (String id : ids) {
        System.out.println(displayTimeZone(TimeZone.getTimeZone(id)));
    }

    System.out.println("\nTotal TimeZone ID " + ids.length);

}

private static String displayTimeZone(TimeZone tz) {

    long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
    long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
                              - TimeUnit.HOURS.toMinutes(hours);
    // avoid -4:-30 issue
    minutes = Math.abs(minutes);

    String result = "";
    if (hours > 0) {
        result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
    } else {
        result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
    }

    return result;

}

-6

GMT代わりに使用してみてくださいUTC。それらは同じタイムゾーンを参照しますが、名前GMTはより一般的で機能する可能性があります。


GMTを使用しても同じ結果になります。
ジム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.