Как суммировать две указанные c даты в Java - PullRequest
0 голосов
/ 05 мая 2020

Как добавить две даты в Java

Пример: сумма «2020-05-06 13:10:00» и «0000-00-00 01:10:00» будет результат: «2020-05-06 14:20:00»

Я пробую что-то вроде этого, но это не работает:

enter image description here

Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Для начала воспользуйтесь новым API. Для секунд представьте концепцию правильного типа.

Например, java.util.Date представляет моменты времени (а не даты; это очень неудачное название). Это определенно не представляет собой понятие «10 минут».

В подходящем (новом) API момент времени, выраженный человеческими терминами, будет ZonedDateTime. Понятие 10 минут будет Duration (длительности имеют установленное количество времени. Периоды более расплывчаты; месяц имеет переменную продолжительность и, таким образом, является периодом; 10 минут всегда равны время и, следовательно, продолжительность).

Duration d = Duration.ofMinutes(10);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.parse("2020-05-06 13:10:00", dtf);

Обратите внимание, что время ввода не имеет часового пояса и местоположения, включенного в него. Следовательно, LocalDateTime - правильный тип для его представления.

Но это проблема: LDT не позволяют добавлять или удалять периоды / длительности. Например, в Амстердаме добавление часа ко времени «2020-03-29 01:30:00» приведет к ... «2020-03-29 03:30:00» - да, это ПОЯВЛЯЕТСЯ как 2 часа, но прошел всего 1 час. Это был именно тот момент, когда часы переводились на час вперед. Это показывает, почему невозможно добавлять или удалять единицы времени, не помещая их в контекст часового пояса, в котором мы находимся.

Таким образом, вы не можете делать здесь то, что хотите; вам нужно сначала «локализовать» его. Давайте продолжим:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Amsterdam"));
ZonedDateTime modified = zdt.plus(d);
System.out.println(dtf.format(modified));

и напечатает 2020-05-06 13:20:00, как вы хотели.

1 голос
/ 05 мая 2020

Разберите вторую строку на числовые части с помощью регулярного выражения и добавьте к значению даты / времени первой строки.

Вот так:

public static LocalDateTime add(LocalDateTime datetime, String interval) {
    Pattern p = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})");
    Matcher m = p.matcher(interval);
    if (! m.matches())
        throw new IllegalArgumentException("Invalid interval: " + interval);
    Period period = Period.of(Integer.parseInt(m.group(1)),
                              Integer.parseInt(m.group(2)),
                              Integer.parseInt(m.group(3)));
    int seconds = (Integer.parseInt(m.group(4)) * 60 +
                   Integer.parseInt(m.group(5))) * 60 +
                  Integer.parseInt(m.group(6));
    return datetime.plus(period).plusSeconds(seconds);
}

Test

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
LocalDateTime datetime = LocalDateTime.parse("2020-05-06 13:10:00", fmt);
System.out.println(add(datetime, "0000-00-00 01:10:00").format(fmt));

Выход

2020-05-06 14:20:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...