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

Posted

技术标签:

【中文标题】考虑 AM/PM 计算 Java 中的日期/时间差【英文标题】:Calculate Date/Time Difference in Java considering AM/PM 【发布时间】:2012-02-18 12:43:48 【问题描述】:

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

考虑到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();
    

【问题讨论】:

如何将字符串转换为Date 对象?以及如何计算差异?如果你使用你链接的代码,你怎么称呼它? @Thomas 我更新了帖子 【参考方案1】:

之所以显示 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】:

考虑使用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);

【讨论】:

感谢您的建议@aviad。但正如我提到的,我必须使用 Date 和 Calendar 类。【参考方案3】:

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

【讨论】:

我认为你是对的@Thomas。我将尝试将其更改为“hh”并测试我所有的案例。【参考方案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 小时制)。

【讨论】:

谢谢@Jesper,我也会试试你的解决方案。但是 HH 和 hh 似乎是我在这里失踪的情况【参考方案5】:

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

【讨论】:

问题是关于计算差异而不是比较。 对不起,我误解了 API。认为 compareTo() 会以毫秒为单位返回差异。【参考方案6】:

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

【讨论】:

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

以上是关于考虑 AM/PM 计算 Java 中的日期/时间差的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 中的日期时间获取 AM/PM [重复]

日期时间的 AM/PM 转换

SQL - 将 varchar (dd/mm/yyyy hh.mm AM/PM) 转换为日期时间

使用时刻将对象中的本地时间转换为UTC

如何以 12 小时 AM/PM 格式显示 JavaScript 日期时间?

如何将日期/时间从 24 小时格式转换为 12 小时 AM/PM? [复制]