【问题标题】:How to find difference between two Joda-Time DateTimes in minutes如何在几分钟内找到两个 Joda-Time DateTimes 之间的差异
【发布时间】:2012-10-12 03:48:35
【问题描述】:

下面是我写的方法:

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。现在我想找出这两个日期之间的差异,我该怎么做?

【问题讨论】:

标签: java jodatime


【解决方案1】:

类似...

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?
  • @DooDah 这是一个很好的问题,我“相信”它确实如此(因为 JodaTime 有LocalTime 的概念),但我建议你测试一下看看。但问题是,结果值将在哪个时区表示?
  • 我会测试并解决这个问题。对我来说,生成的时区很可能是运行代码的服务器。我正在实现一个预定队列,并且需要根据另一个时区的日期计算现在和未来某个时间之间的时间量。我会报告我的发现。
  • 我同意,这应该是选择的答案。它整洁而简单。
  • 创建一个新的 Duration 对象只是为了获得时差并不酷。想象一下,必须对大量日期/时间对象执行时间差。
【解决方案2】:

这将为您提供两个 DateTime 对象之间的差异(以毫秒为单位):

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

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

【讨论】:

  • MadProgrammer 的答案应该是已接受的答案。注意Minutes.minutesBetween 的简单用法。
  • 不,我不同意,它太罗嗦和不清楚:“打卡时间日期时间之间的分钟分钟数”比“第二个日期毫秒数减去第一个日期毫秒数”差
  • 这不会考虑夏令时。
【解决方案3】:

类似...

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

【讨论】:

  • 如果开始日期和结束日期相距很远(大于 int 的大小)则失败
【解决方案4】:
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 不支持闰秒。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2016-02-11
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多