7

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

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

6 回答 6

8

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

于 2012-01-25T10:29:45.553 回答
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

请参阅文档SimpleDateFormat以获取正确的模式。

于 2012-01-25T10:35:03.690 回答
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 小时制)。

于 2012-01-25T10:29:14.237 回答
1

不要自己构建它,使用已建立的库。Jodatime被广泛使用。

于 2012-01-25T10:18:14.130 回答
1

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);
于 2012-01-25T10:19:28.353 回答
-1

Calendar 有一个 add() 方法,也可以用于减法。看看它。无论如何,您应该使用 Calendar 而不是 Date,因为大多数 Date 操作已被弃用。

于 2012-01-25T10:20:21.400 回答