Сохранение разницы между двумя значениями LocalDateTime

Я пытаюсь сохранить разницу между двумя LocalDateTimes. На самом деле я ищу такой класс, как Period, который позволяет мне сохранять дату как время (поскольку Period позволяет мне сохранять только дату).

Какой класс позволит мне это сделать?


person logos    schedule 13.06.2015    source источник
comment
Как насчет продолжительности? См .: docs.oracle.com/javase/8/docs/api/java/time/   -  person rgrebski    schedule 13.06.2015
comment
Если я прав, продолжительность также не хранит даты в виде лет, месяцев и дней, а преобразует их в часы, минуты и секунды.   -  person logos    schedule 13.06.2015
comment
Опишите, пожалуйста, свой вопрос точнее, потому что теперь я запуталась. Также будет полезен пример кода   -  person rgrebski    schedule 13.06.2015
comment
Почему бы не хранить как long или int (миллисекунды или секунды, в зависимости от того, что более полезно для вашего варианта использования)?   -  person Risadinha    schedule 13.06.2015
comment
Я думаю, что это дубликат - см. Другой пост, который содержит гораздо лучшие ответы (также относящийся только к Java-8). В любом случае, каковы ваши окончательные намерения относительно разницы между двумя значениями LocalDateTime? Хорошо, вы хотите сохранить это, но что дальше? Хотите распечатать позже? Если да, то как? Любые другие варианты использования?   -  person Meno Hochschild    schedule 15.06.2015


Ответы (2)


Правильный способ - разложить разницу по единицам времени, например, в этом ответе.


Другой вариант - сохранить разницу дат в периоде и разницу во времени в продолжительности, но в некоторых случаях это может привести к отрицательным единицам:

LocalDateTime now = LocalDateTime.now();
LocalDateTime before = now.minusMonths(1).minusDays(5).minusHours(2).minusMinutes(30);
Period p = Period.between(before.toLocalDate(), now.toLocalDate());
Duration d = Duration.between(before.toLocalTime(), now.toLocalTime());

System.out.println(p + " + " + d);

который выводит: P1M5D + PT2H30M

Угловые случаи: если before = now.minusMonths(1).plusDays(1).plusMinutes(30);, продолжительность минус 30 минут. Это нелегко исправить, потому что выполнение интуитивно понятного:

if (d.isNegative()) {
  p = p.minusDays(1);
  d = d.plusDays(1);
}

В остальных случаях может возвращать отрицательные дни.

person assylias    schedule 13.06.2015
comment
Это реализация, которую я выбрал - person logos; 13.06.2015
comment
С этим кодом есть одна большая проблема. В некоторых случаях пользователи могут получать выражения со смешанными знаками, например, плюс один месяц минус 1 час. - person Meno Hochschild; 15.06.2015
comment
@MenoHochschild Вы правы - спасибо. Я отредактировал соответственно (хотя я не уверен на 100%, что он правильно обрабатывает DST - вероятно, так и будет). - person assylias; 15.06.2015
comment
Извините, что снова раздражает, но что вы сделаете для этого ввода: before = [2015-05-15T23: 00], now = [2015-06-15T00: 00] Я получаю с вашим новым кодом: (плюс один месяц минус один день ) и Duration плюс один час. Что ж, один месяц всегда больше одного дня, но я бы не осмелился представить конечному пользователю такую ​​продолжительность / период. Однако принятый ответ в повторяющейся ссылке относится к случаю границы месяца / дня. - person Meno Hochschild; 15.06.2015
comment
@MenoHochschild Спасибо за ваш вклад - вы тоже здесь. Я согласен с вашей точкой зрения, что это неправильный подход, и внес соответствующие поправки. - person assylias; 15.06.2015

Я думаю, вам следует преобразовать их оба в миллисекунды, а затем произвести вычитание.

LocalDateTime a, b;
long timeInMillis = Math.abs(a.toDateTime().getMillis() - b.toDateTime().getMillis());

Тогда вы получите период в миллисекундах.

person Pâris Douady    schedule 13.06.2015
comment
Спасибо, но вопрос не в расчетах. Проблема заключается в хранении в форме года / месяца / дня / часа / минуты / секунды. - person logos; 13.06.2015
comment
@logos Вы, вероятно, не захотите хранить его как г / м / д / ч / м / с, поскольку год и месяц могут изменять длину в зависимости от того, когда будет иметь место период. Хранение необработанных миллисекунд и выполнение преобразования, когда вам нужно его использовать, было бы более надежным. - person Kiskae; 13.06.2015
comment
Я полностью согласен с Кискай. - person Pâris Douady; 13.06.2015