日历中12点的AM和PM值错误?

3
以下是我用来将日期向后移动3小时的代码。它显示了新时间和上午/下午值。但是当它到达12 pm或am时,它会将新时间的上午/下午值更改为与它来自的12相同的值。即,如果它设置为12 am并且新值为9 pm,则输出9 pm。我是否遗漏了一些简单的东西?我是否正确地认为12 am是午夜?
         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点之前逐小时增加时,它可以很好地工作。但当它到达午夜时,它会显示新值也是上午。


我认为仅打印“部分时间”会对您自己造成不利影响;您能否输出完整的时间,包括分钟、秒和“24小时制”,以明确显示小时数? - sarnold
可以的,我会做并回报。 - Somk
@sarnold,我已经运行了这个建议,它提供的结果有点奇怪。 - Somk
确实很奇怪,感觉 Calendar.AM_PM 不能被信任。 - sarnold
中午和午夜不是“上午”或“下午”。 “AM”是“ante-meridian”(中午之前),而“PM”是“post-meridian”(中午之后),因此根据定义,中午本身不能在中午之前或之后。午夜是12 M(午夜)。 - Lawrence D'Oliveiro
@Lawrence,你说的听起来有点混淆。如果“am”表示中午之前,那么时间不应该在中午之前减少,在中午之后增加吗?{11、10、9、8、7、6、5、4、3、2、1、中午、1、2、3、4、5、6、7、8、9、10、11} - user9599745
3个回答

2

对于午夜/中午,您使用哪个小时值?0和12不同。

例如,对于午夜,您必须将AM_PM设置为AM,并将HOUR设置为0(而不是12)。以AM / PM格式输出的DateFormat会在午夜显示12 AM。


1
我建议在日历对象初始化df对象时显示精确的小时字符串,如下所示:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 然后将日期字符串2012-05-19 12:00:00转换为日历对象时,小时将为12而不是0。
但如果您使用的是日期格式为
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
则12将被转换为0小时。

但是如何使午夜12点成为下午12点? - user9599745

0

只需将小时设置为0即可。其他所有内容都可以保持不变,它将正常工作。在Java Calendar API中,甚至说“中午和午夜由0表示,而不是12”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接