我想使用Date和Calendar类计算java中两个日期/时间之间的差异。我的格式是“2012-01-24 12:30:00 PM”。
我已经实现了自己的方法,并将其谷歌与其他人合作,但没有得到正确的提示来处理AM和PM值。
每当时间有12(上午/下午)时,日期/时间差异就会受到影响。例如,如果我有日期/时间“2012-01-24 12:30:00 PM”和“2012-01-24 02:30:00 PM”,则显示差异为10小时。
考虑this link上的代码,如何修改代码以处理AM和PM。
要将字符串日期转换为日期,请使用以下代码:
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();
}
答案 0 :(得分:7)
问题在于您的日期格式:而不是yyyy-MM-dd HH:mm:ss a
使用yyyy-MM-dd hh:mm:ss a
。
HH
将是一天中的小时(0-23),而hh
将是上午/下午(1-12)的小时。因此,您的日期格式02:30:00将被解析为而不是转换为PM版本(在一天中的小时为14:30:00)。
答案 1 :(得分:5)
它显示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
。
请参阅documentation for SimpleDateFormat
以确保您的模式正确。
答案 2 :(得分:4)
那么,你有这些日期作为字符串吗?使用具有相应格式字符串的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小时制)。
答案 3 :(得分:1)
不要自己构建它,使用已建立的库。 Jodatime被广泛使用。
答案 4 :(得分:1)
onsider使用Apache Commons DateUtils DurationFormatUtils formatPeriod方法将起到魔力。
祝你好运!EDIT 假设此时已初始化日期a和日期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);
答案 5 :(得分:-1)
Calendar有一个方法add(),可用于减法。看看吧。您应该使用Calendar而不是Date,因为大多数Date操作都已弃用。