/ / Calendar.HOUR_OF_DAY混乱 - java、カレンダー、タイムゾーン、java.util.date

Calendar.HOUR_OF_DAY混乱 - Java、カレンダー、タイムゾーン、java.util.date

私はこのコードを持っています:

Calendar cal = Calendar.getInstance();
cal.setTime(pDatum);
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2)));
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4)));
cal.set(Calendar.MILLISECOND, 0);
System.out.println(cal.getTime());

どこで pDatumSun Mar 27 00:00:00 CET 2016, pHHMMTP02485 そして pHHMMTP.substring(0, 2)02.

出力は次のとおりです。

日3月27日03:48:00 CEST 2016

私は期待する:

日3月27日02:48:00 CEST 2016

まず私はそれが TimeZone 問題がありますが、このコードで私は同じ出力を得ます:

Calendar cal = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("GMT");
cal.setTimeZone(tz);
cal.setTime(pDatum);
cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(pHHMMTP.substring(0, 2)));
cal.set(Calendar.MINUTE, Integer.valueOf(pHHMMTP.substring(2, 4)));
cal.set(Calendar.MILLISECOND, 0);

あなたは私の問題を見ますか?

回答:

回答№1は2

CETの意味 中央ヨーロッパのタイムゾーン。ヨーロッパでは、 夏時間.

基本的に、冬は1時間から時間がずれます。 実用的な理由(実際には睡眠の質)のため、時間の切り替えは2016年3月27日の春の第一日曜日に行われます。午前3時、つまり時計は次のようにカウントダウンします。 01:58, 01:59, 03:00, 03:01。これの意味は、 Sun Mar 27 02:48:00 CET 2016 存在しない.
結果として、あなたがあなたのコードを実行するならば Sun Mar 27、あなたは 03:48 あなたがそれを実行した場合 Mon Mar 28、あなたは 02:48.

両方の日付で試してください。

//Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("27/03/2016 CET");
Date date = new SimpleDateFormat("dd/MM/yyyy z").parse("28/03/2016 CET");

Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 48);
cal.set(Calendar.MILLISECOND, 0);

System.out.println(cal.getTime());

出力:

月Mar 28 02:48:00 CEST 2016


回答№2の場合は1

これは「タイムゾーンの問題です、あなたは」GMTでカレンダーを作成していますが、CESTゾーンで日付を表示しています。

編集:

同じタイムゾーンで日付が表示されたら、それで大丈夫です。

  Calendar cal = Calendar.getInstance();
TimeZone tz = TimeZone.getTimeZone("GMT");
cal.setTimeZone(tz);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 48);
cal.set(Calendar.MILLISECOND, 0);

System.out.println(cal.getTime()); // <-- System default Zone

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
formatter.setTimeZone(tz);

System.out.print(formatter.format(cal.getTime())); // <-- Same TimeZone

出力:

Tue Mar 22 03:48:06 CET 2016
Tue Mar 22 02:48:06 GMT 2016