3

以下は、日付を3時間戻すために使用しているコードです。新しい時刻と午前午後の値が表示されます。しかし、午後 12 時または午前になると、新しい時刻の午前午後の値が元の 12 時と同じ値に変更されます。つまり、午前 12 時に設定され、新しい値が午後 9 時である場合、午後 9 時が出力されます。簡単なものがありませんか?午前 12 時が真夜中ということを正しく考えているでしょうか。

         calendar.set(Calendar.HOUR, HourValue);
         calendar.set(Calendar.MINUTE, MinValue);
         calendar.set(Calendar.SECOND, 0);
         if(AMPM.equals("AM")){ampmval=0;}
         else{ampmval=1;}
         Log.e("AMPMVAL Before",Integer.toString(ampmval));

         sdf = new SimpleDateFormat("hh");
         NewHourValue = sdf.format(calendar.getTime());
         Log.e("Before Time",NewHourValue);

         calendar.set(Calendar.AM_PM, ampmval);
         calendar.add(Calendar.MINUTE, -300);

         int AmOrPm = calendar.get(Calendar.AM_PM);
         Log.e("AMPMVAL After",Integer.toString(AmOrPm)); 
         sdf = new SimpleDateFormat("hh");
         NewHourValue = sdf.format(calendar.getTime());
         Log.e("After Time",NewHourValue);

これは次のようなものを出力します

05-15 23:07:11.233: E/Before Time(457):   09:00:00 PM
05-15 23:07:11.240: E/AMPMVAL After(457): 0
05-15 23:07:11.640: E/After Time(457):    06:00:00 AM
05-15 23:07:23.369: E/AMPMVAL Before(457):0
05-15 23:07:23.742: E/Before Time(457):   10:00:00 PM
05-15 23:07:23.749: E/AMPMVAL After(457): 0
05-15 23:07:24.113: E/After Time(457):    07:00:00 AM
05-15 23:07:28.320: E/AMPMVAL Before(457):0
05-15 23:07:28.712: E/Before Time(457):   11:00:00 PM
05-15 23:07:28.720: E/AMPMVAL After(457): 0
05-15 23:07:29.112: E/After Time(457):    08:00:00 AM
05-15 23:07:34.700: E/AMPMVAL Before(457):1
05-15 23:07:35.300: E/Before Time(457):   12:00:00 AM
05-15 23:07:35.330: E/AMPMVAL After(457): 1
05-15 23:07:35.693: E/After Time(457):    09:00:00 PM

ご覧のとおり、午前 12 時 (真夜中) の前の時間をインクリメントすると正常に動作しますが、真夜中になると、新しい値も午前中にあると表示されます。

4

2 に答える 2

2

真夜中/正午に使用する HOUR 値は? 0 と 12 は同じではありません。

たとえば、真夜中の場合は、0 (12 ではなく)に設定AM_PMする必要がAMあります。AM/PM 形式の出力は、真夜中の午前 12 時を示します。HOURDateFormat

于 2012-05-16T08:16:25.340 に答える
1

Calendar オブジェクトに正確な時間文字列を表示し、以下のように df オブジェクトを初期化することをお勧めします::

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 次に、日付文字列 2012-05-19 12:00:00 を Calendar オブジェクトに変換すると、Hour は 0 ではなく 12 になります。

しかし、あなたは日付形式を次のように使用しています

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

12 は時間単位で 0 に変換されます

于 2013-07-23T05:52:12.260 に答える