Я намагаюся обчислити різницю між двома LocalDateTime
.
Вихід повинен бути форматом y years m months d days h hours m minutes s seconds
. Ось що я написав:
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;
public class Main {
static final int MINUTES_PER_HOUR = 60;
static final int SECONDS_PER_MINUTE = 60;
static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
public static void main(String[] args) {
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 9, 19, 46, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Period period = getPeriod(fromDateTime, toDateTime);
long time[] = getTime(fromDateTime, toDateTime);
System.out.println(period.getYears() + " years " +
period.getMonths() + " months " +
period.getDays() + " days " +
time[0] + " hours " +
time[1] + " minutes " +
time[2] + " seconds.");
}
private static Period getPeriod(LocalDateTime dob, LocalDateTime now) {
return Period.between(dob.toLocalDate(), now.toLocalDate());
}
private static long[] getTime(LocalDateTime dob, LocalDateTime now) {
LocalDateTime today = LocalDateTime.of(now.getYear(),
now.getMonthValue(), now.getDayOfMonth(), dob.getHour(), dob.getMinute(), dob.getSecond());
Duration duration = Duration.between(today, now);
long seconds = duration.getSeconds();
long hours = seconds / SECONDS_PER_HOUR;
long minutes = ((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
long secs = (seconds % SECONDS_PER_MINUTE);
return new long[]{hours, minutes, secs};
}
}
Вихід, який я отримую, - це 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Я перевірив свій результат на цьому веб-сайті (зі значеннями 12/16/1984 07:45:55
та 09/09/2014 19:46:45
). На наступному скріншоті показано вихід:
Я майже впевнений, що поля після значення місяця неправильно входять у мій код. Будь-яка пропозиція буде дуже корисною.
Оновлення
Я перевірив свій результат на іншому веб-сайті, і результат, який я отримав, відрізняється. Ось це: Обчисліть тривалість між двома датами (результат: 29 років, 8 місяців, 24 дні, 12 годин, 0 хвилин і 50 секунд).
Оновлення
Оскільки я отримав два різних результати з двох різних сайтів, мені цікаво, чи законний алгоритм мого розрахунку чи ні. Якщо я використовую наступні два LocalDateTime
об'єкти:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Тоді вихід виходить: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
З цього посилання має бути 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Тож алгоритм теж повинен поводитися з від’ємними числами.
Зауважте, питання полягає не в тому, який сайт дав мені результат, мені потрібно знати правильний алгоритм і потрібно мати правильні результати.
7:45:55
та час закінчення 19:46:45
(або 7:46:45
ПМ). Отже різниця між цими двома разів становить 12 годин, 0 хвилин і 50 секунд, а ніколи 23 години, 34 хвилини і 12 секунд. Тож ваш фактичний розрахунок здається правильним, принаймні на часовій частині.
LocalDateTime
немає часового поясу, то може бути і не було однозначної відповіді. Навіть якщо ви припускаєте, що початковий і кінцевий часові зони однакові, у деяких зонах дати, наприклад, 09.09.2014, будуть в літній та літній час, а в інших - не. Це може скинути речі за годину. Тож обчислювати різницю до другого безглуздо, якщо це не вирішено.
LocalDateTime
результатів дає нереалістичні результати, оскільки цьому класу навмисно не вистачає жодної концепції часового поясу чи зміщення від UTC? Для реалістичних значень призначте часовий пояс через ZoneId
для використання ZonedDateTime
.
Period.between()
застосувати деяке округлення?