我想使用 Date 和 Calendar 类计算 java 中两个日期/时间之间的差异。我的格式是“2012-01-24 12:30:00 PM”。
我已经实现了自己的方法,并且还通过谷歌搜索它来与其他人合作,但没有得到处理 AM 和 PM 值的正确提示。
只要时间中有 12 点(AM/PM),日期/时间差异就会出现问题。例如,如果我有日期/时间“2012-01-24 12:30:00 PM”和“2012-01-24 02:30:00 PM”,则显示差异为 10 小时。
考虑此链接上的代码如何修改以处理上午和下午。
要将字符串日期转换为日期,我使用以下代码:
String sessionTimeStart = "2012-01-24 12:30:00 PM";
String sessionTimerEndOrCurrent = "2012-01-24 02:30:00 PM";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
Date d1 = null;
Date d0 = null;
try {
d1 = format.parse(sessionTimeStart);
d0 = format.parse(sessionTimerEndOrCurrent);
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
问题在于您的日期格式:不要使用
yyyy-MM-dd HH:mm:ss a
,而是使用 yyyy-MM-dd hh:mm:ss a
。
HH
表示一天中的小时 (0-23),而 hh
表示 AM/PM 中的小时 (1-12)。因此,使用您的日期格式 02:30:00 将被解析为该格式,而不是转换为 PM 版本(一天中的某个小时为 14:30:00)。
之所以显示 10 小时的差异,是因为您在解析输入时出现了模式错误。
这是一个使用
SimpleDateFormat
的示例:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
Date date1 = df.parse("2012-01-24 12:30:00 PM");
Date date2 = df.parse("2012-01-24 02:30:00 PM");
long differenceInHours = Math.abs(date1.getTime() - date2.getTime()) / 1000 / 60 / 60);
会回来
10
。
当我们稍微更改日期格式模式时,使用
hh
表示上午/下午 (1-12) 中的小时,而不是 HH
表示一天中的小时 (0-23):
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
它返回(预期的)
2
。
请参阅 文档
SimpleDateFormat
以获得正确的模式。
那么,你有这些日期作为字符串吗?使用
SimpleDateFormat
和适当的格式字符串解析它们,并计算小时数的差异:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
Date d1 = df.parse("2012-01-24 12:30:00 PM");
Date d2 = df.parse("2012-01-24 02:30:00 PM");
int hoursDifference = (int)((d2.getTime() - d1.getTime()) / 3600000L);
System.out.println("Difference in hours: " + hoursDifference);
您的错误是您在格式字符串中使用 HH(24 小时制)而不是 hh(12 小时制)。
不要自己构建它,使用已建立的库。 Jodatime被广泛使用。
考虑使用 Apache Commons DateUtils DurationFormatUtils formatPeriod 方法将会发挥神奇作用。
祝你好运!
编辑 假设此时已初始化 Date a 和 Date b,
String format="HH:mm:ss.SSS"; // whatever you wish
boolean padWithZeros=true; // whatever you wish
TimeZone timezone=null; // whatever you wish
long timeA = a.getTime();
long timeB = b.getTime();
String period = DurationFormatUtils.formatPeriod(timeB, timeA, format, padWithZeros, timezone);
日历有一个方法 add() 也可以用于减法。看看它。无论如何,您应该使用日历而不是日期,因为大多数日期操作已被弃用。