如何以分钟为单位查找两个Joda-Time DateTime之间的差异


141

下面是我写的方法:

public List<Map<String, Object>> loadNotYetInEmployee(int shift, Date date,
        int transitionVal, String type, User user) {

    DateTime datetime = new DateTime(date);
    datetime = datetime
            .plus(Period.minutes(shiftTiming.getSession1InTime()));

    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

    sql = SqlMapUtils.getSql("attendance.attendancestatus.latein",
            parameters);
    result = getJdbcTemplate().queryForList(sql);
    for (int i = 0; i < result.size(); i++) {
        Date punchInTime = (Date) result.get(i).get("punchtime");
        DateTime punchTime = new DateTime(punchInTime);
    }
    return result;
}

现在,从我的方法中,您可以看到我在名为的对象中有一个Joda-Time DateTime对象datetime,从结果中,我得到一个时间戳,该时间戳将转换为jodatime punchTime。现在,我想找出这两个日期之间的差异,该怎么办?



2
但这仅在您的DateTime对象位于同一TimeZone中时有效。
Tiago

Answers:


79

这将使您获得两个DateTime对象之间的差(以毫秒为单位):

DateTime d1 = new DateTime();
DateTime d2 = new DateTime();

long diffInMillis = d2.getMillis() - d1.getMillis();

78
MadProgrammer的答案应该是被接受的答案。请注意的简单用法Minutes.minutesBetween
罗勒·布尔克

5
不,我不同意,它太罗and和不清楚:“打孔时间日期时间之间的分钟数”比“第二个日期毫秒减去第一个日期毫秒”差
乔纳森·纽费尔德

4
这将不考虑夏令时。
Sander Versluys

454

就像是...

DateTime today = new DateTime();
DateTime yesterday = today.minusDays(1);

Duration duration = new Duration(yesterday, today);
System.out.println(duration.getStandardDays());
System.out.println(duration.getStandardHours());
System.out.println(duration.getStandardMinutes());

哪些输出

1
24
1440

要么

System.out.println(Minutes.minutesBetween(yesterday, today).getMinutes());

您可能追求的更多


以上是否考虑了时区?还是我应该先转换为UTC / GMT?
Doo Dah

@DooDah这是一个很好的问题,我“相信”它确实可以做到(因为JodaTime具有的概念LocalTime),但是我建议您对其进行测试然后看看。问题是,在哪个时区中表示结果值?
MadProgrammer '16

我将进行测试并找出答案。对我来说,产生的时区可能是代码在其上运行的服务器。我正在实现计划的队列,因此需要根据另一个时区中的日期计算从现在到将来的时间。我将报告我发现的情况。
Doo Dah

2
我同意,这应该是选择的答案。它的整洁和简单。
Sid

创建一个新的Duration对象只是为了获得时差并不酷。想象一下必须对大量的日期/时间对象执行时差。
AndroidDev


3
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

在实践中,我认为这将始终提供与基于的答案相同的结果Duration。但是,对于不同于分钟的时间单位,它可能更正确。例如,从2016/2/2到2017/2/1共有365天,但实际上少于1年,如果使用,则应截断为0年PeriodType.years()

理论上,由于leap秒,几分钟内可能会发生同样的情况,但Joda不支持leap秒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.