两个Joda LocalDateTimes的差异

10

我有两个Joda LocalDateTime对象,需要产生一个第三个对象,表示它们之间的差异:

LocalDateTime start = getStartLocalDateTime();
LocalDateTime end = getEndLocalDateTime();

LocalDateTime diff = ???
我唯一能想到的方法是费力地逐个处理每个日期/时间字段,并执行其相应的 减法 操作。
LocalDateTime diff = end;

diff.minusYears(start.getYear());
diff.minusMonths(start.getMonthOfYear());
diff.minusDays(start.getDayOfMonth());
diff.minusHours(start.getHourOfDay());
diff.minusMinutes(start.getMinuteOfHour());
diff.minusSeconds(start.getSecondsOfMinute());
最终结果只需要调用difftoString()方法并获得有意义的结果。例如,如果start.toString()产生2012/02/08T15:05:00,而end.toString()产生2012/02/08T16:00:00,则diff.toString()将是差异(55分钟),可能看起来像2012/02/08T00:55:00。
如果这是对LocalDateTime的糟糕滥用,那么我只需要知道如何计算两者之间的时间差并将该差异转化为易于阅读(人类友好)的格式。
提前致谢!
4个回答

20
你可以使用 org.joda.time.Period 类来实现这个功能,特别是使用 fieldDifference 方法。

例如:

LocalDateTime endOfMonth = now.dayOfMonth().withMaximumValue();
LocalDateTime firstOfMonth = now.dayOfMonth().withMinimumValue();
Period period = Period.fieldDifference(firstOfMonth, endOfMonth)

6
我喜欢 Joda,但它总是让我感到不知所措。PeriodDuration 听起来相似,但实际上有很大的区别。我知道它们的用途,但并不总是直观易懂。 - Michael Piefel
@MPi:同意。什么是“ReadablePartial”?为什么我需要它来查看“LocalDateTime”是否在一定时间之前?啊! - william.berg
因为时间段可能是一个未定义的绝对时间。例如,14:35至15:36之间的时间段,它是一个“部分可读取”的“一天中的时间”,将始终是1小时1分钟。 - Niclas Hedhman
重点是Period考虑到夏令时等因素;两个时间之间的Period可能并不总是看起来应该是什么,这取决于所选择的开始/结束日期时间。Duration更简单,它始终是一个固定的确切时间量。 - Ed Randall

10

Duration在某些情况下更为实用。通过以下技巧,您可以获得“与时区无关”的持续时间,以便在本地时间线中与LocalDateTimes一起使用:


public static Duration getLocalDuration(LocalDateTime start, LocalDateTime end) {
    return new Duration(start.toDateTime(DateTimeZone.UTC), end.toDateTime(DateTimeZone.UTC));
}

1

我找到了一个解决方法,以下是具体步骤:

  1. 使用两个LocalDateTime对象作为开始和结束时间
  2. 将它们都转换为Instant对象,例如 start.toInstant(ZoneOffset.UTC);
  3. 使用 Duration.between(instant t1, instant t2) 计算持续时间
  4. 使用各种转换方法将其转换为纳秒、毫秒或秒。纳秒可以通过 Duration.toNanos() 计算

下面提供了完整的示例。

public long getDuration(LocalDateTime start, LocalDateTime end) {

    //convert the LocalDateTime Object to an Instant 
    Instant startInstant = start.toInstant(ZoneOffset.UTC);         
    Instant endInstant   =   end.toInstant(ZoneOffset.UTC);

    //difference between two Instants is calculated
    //convert to nano seconds or milliseconds 
    long duration=Duration.between(startInstant, endInstant).toNanos();

    return duration;
}

0
public static void printTimeDiffJoda(final String start, final String end) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try {
            // Parse datetime string to org.joda.time.DateTime instance
            DateTime startDate = new DateTime(format.parse(start));
            DateTime endDate = new DateTime(format.parse(end));

            System.out.println("Joda Time API - Time Difference ");
            System.out.println("in years: " + Years.yearsBetween(startDate, endDate).getYears());
            System.out.println("in months: " + Months.monthsBetween(startDate, endDate).getMonths());
            System.out.println("in days: " + Days.daysBetween(startDate, endDate).getDays());
            System.out.println("in hours: " + Hours.hoursBetween(startDate, endDate).getHours());
            System.out.println("in minutes: " + Minutes.minutesBetween(startDate, endDate).getMinutes());
            System.out.println("in seconds: " + Seconds.secondsBetween(startDate, endDate).getSeconds());
            System.out.println();

        } catch (ParseException e) {
            e.printStackTrace();
        }
}

通过http://www.luyue.org/calculate-difference-between-two-dates/实现


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