Разница двух Joda LocalDateTimes

У меня есть 2 объекта Joda LocalDateTime, и мне нужно создать третий, который представляет разницу между ними:

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

LocalDateTime diff = ???

Единственный способ, который я могу понять, - это кропотливо просмотреть каждое поле даты/времени и выполнить соответствующую операцию minus:

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());

Конечным результатом будет просто вызов метода toString() diff и получение чего-то осмысленного. Например, если start.toString() выдает 2012/02/08T15:05:00, а end.toString() выдает 2012/02/08T16:00:00, то diff.toString() будет разницей (55 минут) и может выглядеть как 2012/02/08T00:55: 00.

И если это ужасное злоупотребление LocalDateTime, то мне просто нужно знать, как взять разницу во времени между ними и поместить эту разницу в удобный для чтения (удобный для человека) формат.

Заранее спасибо!


person IAmYourFaja    schedule 16.02.2012    source источник


Ответы (4)


Вы можете использовать org.joda.time.Period. для этого — в частности, fieldDifference.

Пример:

LocalDateTime endOfMonth = now.dayOfMonth().withMaximumValue();
LocalDateTime firstOfMonth = now.dayOfMonth().withMinimumValue();
Period period = Period.fieldDifference(firstOfMonth, endOfMonth)
person Ilya    schedule 16.02.2012
comment
Мне нравится Джода, но я всегда ошеломлен. Period и Duration звучат одинаково, но совершенно разные. Я вижу потребность, но она не всегда интуитивно понятна. - person Michael Piefel; 30.04.2012
comment
@MPi: Согласен. Что такое ReadablePartial? Зачем мне это нужно, чтобы видеть, был ли LocalDateTime определенное количество времени назад? Ах! - person william.berg; 05.02.2013
comment
Потому что Period может быть неопределенным абсолютным временем. Например, период между 14:35 и 15:36, который является временем суток PartialReadable, всегда будет равен 1 часу и 1 минуте. - person Niclas Hedhman; 19.05.2013
comment
Дело в том, что Period учитывает такие вещи, как переход на летнее время; a Период между двумя значениями времени не всегда может быть таким, каким он должен быть, в зависимости от выбранной даты начала/окончания. Duration проще, это всегда будет фиксированное точное количество времени. - person Ed Randall; 21.05.2013
comment

В некоторых случаях лучше выбрать Длительность. Вы можете получить «независимую от часового пояса» продолжительность для использования с LocalDateTimes (в локальной временной шкале) с помощью этого трюка:

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

Я нашел обходной путь, выполнив следующие шаги:

  1. Возьмите два объекта LocalDateTime как Start и End
  2. Преобразуйте их оба в мгновенный объект, например 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;
}
person Irshad    schedule 02.01.2015

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/

person Cícero Moura    schedule 24.04.2015