2015-06-13 2 views
0

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

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

+1

Как насчет продолжительности? См. Https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#between-java.time.temporal.Temporal-java.time.temporal.Temporal- – rgrebski

+0

Если i ' m correct, duration также не сохраняет даты в виде лет месяцев и дней, но преобразует их в часовые минуты и секунды. – logos

+0

Просьба более точно рассказать о вашем вопросе, потому что теперь Im запутался. Образец кода также будет полезен – rgrebski

ответ

1

Правильный путь для разложения разности на единицу времени, например, в this answer.


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

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

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

+0

Это реализация, которую я выбрал – logos

+0

Существует одна большая проблема с этим кодом. В некоторых случаях пользователи могут получать выражения со смешанными знаками, например плюс один месяц минус 1 час. –

+0

@MenoHochschild Вы правы - спасибо. Я отредактировал соответственно (хотя я не уверен на 100%, что он правильно справляется с DST - возможно, это будет). – assylias

1

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

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

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

+0

Спасибо, но расчет не является проблемой. Это проблема хранения в виде года/месяца/дня/часа/минуты/секунды. – logos

+0

@logos Вероятно, вы не захотите хранить его как y/m/d/h/m/s, так как год и месяц могут изменять длину в зависимости от того, когда будет проходить период. Хранение необработанных миллисекунд и выполнение преобразования, когда вам нужно использовать его, было бы более надежным. – Kiskae

+0

Я полностью согласен с Kiskae. –

0
@Test 
    public void durationTest(){ 
     LocalDateTime now = LocalDateTime.now(); 
     LocalDateTime nowMinus5s = now.minusSeconds(5); 

     assertThat(Duration.between(now, nowMinus5s).getSeconds()).isEqualTo(-5); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^