2012-01-25 127 views
7

我想使用Date和Calendar类来计算java中两个日期/时间之间的差异。我拥有的格式是“2012-01-24 12:30:00 PM”。计算Java中考虑AM/PM的日期/时间差异

我已经实现了我自己的方法,也谷歌它与他人合作,但没有得到正确的提示来处理AM和PM值。

每当时间有12(AM/PM)时,日期/时间差异就会陷入困境。例如,如果我有日期/时间“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

如何将字符串转换为Date对象?你如何计算差异?如果你使用你链接的代码,你怎么称呼它? – Thomas

+0

@Thomas我已更新帖子 – rizzz86

回答

6

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

+0

我认为你是对的@Thomas。我会尝试将它改为'......'并测试我的所有情况。 – rizzz86

1

自己不要建了,使用建立的图书馆。 Jodatime被广泛使用。

+0

感谢您的建议@他。但正如我所提到的,我必须使用Date和Calendar类。 – rizzz86

1

旁边使用Apache Commons DateUtils DurationFormatUtils formatPeriod方法将做到神奇。

祝你好运!

编辑 假设你有一个日期和日期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); 
+0

感谢您的建议@aviad。但正如我所提到的,我必须使用Date和Calendar类。 – rizzz86

+0

@ rizzz86,看我的编辑。 – aviad

-1

日历有梅索德的add()可用于从其减去了。看看它。无论如何,您应该使用日历而不是日期,因为大多数日期操作已被弃用。

+1

问题是关于计算差异而不是比较。 – aviad

+0

对不起,我误解了API。思想compareTo()会返回以毫秒为单位的差异。 –

+0

找到了另一种解决方案。也许这次是正确的;-) –

3

所以,你有这些日期为字符串?用适当的格式字符串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-hour小时),而不是HH(12小时小时)在您的格式字符串。

+0

谢谢@Jesper,我也会尝试你的解决方案。但HH和HH似乎是我在这里失踪的情况 – rizzz86

4

它显示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在AM/PM(1-12)小时,而不是HH(0-23):

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

它返回(预计)2

查看documentation for SimpleDateFormat让您的模式正确。