如何在Joda-Time中找到两个DateTime之间的分钟差异

153
以下是我编写的方法:
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;
}

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

10
"Minutes#minutesBetween"是你的好帮手。 - Luiggi Mendoza
2
但是这只有在您的DateTime对象处于相同的时区时才有效。 - Bitcoin Cash - ADA enthusiast
1
Days.daysBetween(d1, d2) 是你朋友的邻居。 - Shubham Chaudhary
4个回答

481

类似于...

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
我会测试并找出答案。对我来说,结果时区可能是代码运行的服务器。我正在实现一个定时队列,并需要根据另一个时区的日期计算现在和未来某个时间之间的时间差。我会回报我的发现。 - Doo Dah
2
我同意,这应该是被选中的答案。它很整洁简单。 - Sid
鉴于它比手动计算结果更精确,我认为这是一个更好的解决方案。另外,如果这样做 "真的不酷",你可以只使用 long diffInMinutes = ChronoUnit.MINUTES.between(fromdate, todate); , 而不用在意。 - MadProgrammer
显示剩余2条评论

84

这将为您获取两个DateTime对象之间的毫秒差:

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

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

80
MadProgrammer的回答应该作为被接受的答案。注意到了Minutes.minutesBetween的简单使用。 - Basil Bourque
5
我不同意,"打卡时间日期之间的分钟数"比"第二个日期毫秒数减去第一个日期毫秒数"更啰嗦且含义不清。 - Coder Guy
5
这不会考虑夏令时。 - Sander Versluys

12

类似于...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();

如果开始日期和结束日期相差太远(大于int类型的大小),则会失败。 - dannyRods

6
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年,如果使用PeriodType.years(),应该截断为0年。
理论上,由于闰秒,分钟也可能发生这种情况,但Joda不支持闰秒。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接