考虑AM / PM,计算Java中的日期/时间差

我想使用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小时。

考虑到此链接上的代码,如何修改它以处理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(); } 

问题是你的日期格式:而不是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)。

它显示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被广泛使用。

onsider使用Apache Commons DateUtils DurationFormatUtils formatPeriod方法将起到魔力。

祝你好运!

编辑假设此时已初始化日期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); 

Calendar有一个方法add(),也可用于减法。 看看吧。 您应该使用Calendar而不是Date,因为大多数Date操作都已弃用。