Добавьте выражение продолжительности времени Java 8 ISO 8601 в java.util.Date. - PullRequest
0 голосов
/ 30 июня 2018

У меня есть выражение типа "PT20.345S", "P2DT3H4M" и т. Д., Как описано здесь https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java.lang.CharSequence-

Как мне разобрать это, добавить его к текущему времени и получить объект java.util.Date?

Ни одна из работ не работает:

Date d1 = Date.from(LocalDateTime.now().plus(Duration.parse(_expression)));
Date d2 = Date.from(Duration.parse(_expression).addTo(LocalDateTime.now()));

Ответы [ 2 ]

0 голосов
/ 30 июня 2018
Duration amountToAdd = Duration.parse("PT20.345S");  // Represent a span of time. Here, about twenty and a third seconds.
Instant now = Instant.now() ;                        // Capture the current moment in UTC.
Instant otherMoment = now.plus(amountToAdd);         // Add the span-of-time to the current moment, for a moment in the future (or in the past if the duration is negative).
String output = otherMoment.toString():              // Generate a String in standard ISO 8601 format.

2018-06-30T19: 34: 47Z

Преобразование из современного java.time класса в унаследованный класс.

Date date1 = Date.from(otherMoment);
System.out.println(date1);

Сейчас я работаю в часовом поясе Европы / Копенгагена.

Сб. 30 июня 21:34:47 CEST 2018

Если я использую другую примерную строку продолжительности, P2DT3H4M, я получу:

вт. 03 июля 00:38:26 CEST 2018

Или, если вы в одной строке:

    Date date1 = Date.from(Instant.now().plus(Duration.parse("PT20.345S")));

Класс java.util.Date давно устарел, поэтому в идеале вам не следует его иметь. В любом случае, если он вам нужен, как правило, для устаревшего API, который вы не можете изменить или не хотите менять прямо сейчас, вы думаете правильно, выполняя как можно больше логики, используя java.time, современный Java API даты и времени и преобразование в Date только в конце. Ближайший кузен Date в современном мире - Instant, и существуют прямые преобразования между Instant и Date, поэтому я использую этот класс. Instant также прекрасно независимо от смещения зон и часовых поясов.

0 голосов
/ 30 июня 2018

В вашем коде первое решение должно работать, если вы преобразуете LocalDateTime в Instant с ZoneOffset (например, UTC или по умолчанию вашей системы с использованием ZoneOffset.systemDefault()), как показано ниже:

Date d1 = Date.from(LocalDateTime.now().plus(Duration.parse(_expression)).toInstant(OffsetDateTime.now().getOffset());

Однако , LocalDateTime неправильно используется в этом случае, поскольку оно не представляет момент, не является точкой на временной шкале

С Javadoc :

Этот класс не хранит и не представляет часовой пояс. Вместо этого, это описание даты, используемой для дней рождений, в сочетании с местным временем, показанным на настенных часах. Он не может представлять момент на временной шкале без дополнительной информации, такой как смещение или часовой пояс.

Но, Instant - это момент времени на UTC

.

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

Итак, если вы используете Мгновенное действие, вы точно знаете, на какой момент времени ссылаются, независимо от часовых поясов. Поскольку вы собираетесь обрабатывать бизнес-логику, такую ​​как добавление количества времени к текущему времени и преобразование в дату, это удобный класс для использования.

 Date date1 = Date.from(Instant.now().plus(Duration.parse("PT20.345S")));
...