Какой класс Java DateTime я должен использовать? - PullRequest
0 голосов
/ 25 января 2019

У нас есть библиотека для генерации отчетов. Он считывает данные из файла данных (SQL, XML, JSON и т. Д.), Затем время и дата могут быть изменены в пользовательском уравнении, а затем отформатированы так, как указано для вывода отчета.

Использование в уравнении позволяет добавить интервал времени, получить части значения, как в «if date.month == 2», и в значительной степени все макросы даты и времени в Excel .

Поскольку данные могут быть в формате JSON (или XML без схемы), дата и время могут быть «2019-01-25», «2019-01-25T14: 32: 23», «2019-01-25T14: 32: 23.12345 "," 2019-01-25T14: 32: 23Z "или" 2019-01-25T14: 32: 23Z-0500 "(последние два также могут иметь" .12345 ").

Если нет смещения часового пояса, мы предполагаем, что дата и время - UTC. Хотя это должно быть правдой, часто это не так, и это местное время, но то, как оно используется, это не имеет значения. Таким образом, сделать его UTC, если не указано смещение часового пояса, работает (до этого момента мы использовали дату).

Первый вопрос - какой класс мне использовать для хранения этого значения? Из того, что я прочитал, я думаю, что ZonedDateTime, но, может быть, Instant?

Второй вопрос - какой класс я должен использовать для расписания, когда мне нужно что-то вроде добавить 3 дня к дате?

Третий вопрос - есть ли какой-нибудь парсер, который может анализировать все разные строки, как я перечислил выше? Или мне нужно вызвать String.contains (), чтобы определить формат, а затем сделать явный шаблон, основанный на этом? И если да, то с помощью какого класса?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Третий вопрос - есть ли какой-нибудь парсер, который может анализировать все разные строки, как я перечислил выше? Или мне нужно вызвать String.contains (), чтобы определить формат, а затем сделать явный шаблон, основанный на этом? И если да, то с помощью какого класса?

Я могу быть ужасно неправ, но вы можете использовать DateTimeFormatter с дополнительными частями в шаблоне и parseBest метод:

List<String> dates = List.of(
    "2019-01-25", 
    "2019-01-25T14:32:23",
    "2019-01-25T14:32:23.12345", 
    "2019-01-25T14:32:23Z", 
    "2019-01-25T14:32:23Z-0500"
);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
   "yyyy-MM-dd['T'[HH:mm:ss][.SSSSS]][z][x]"
); // all the possible combinations

dates.forEach( date -> {
            TemporalAccessor accessor = formatter.parseBest(date,                       
       OffsetDateTime::from, // going from most specific date
       LocalDateTime::from, 
       LocalDate::from); // to the less specific 

            System.out.println( accessor.getClass() + " " + accessor);
        }

);

// output for this is 
class java.time.LocalDate 2019-01-25
class java.time.LocalDateTime 2019-01-25T14:32:23
class java.time.LocalDateTime 2019-01-25T14:32:23.123450
class java.time.OffsetDateTime 2019-01-25T14:32:23Z
class java.time.OffsetDateTime 2019-01-25T14:32:23-05:00
0 голосов
/ 25 января 2019

Что касается 2-го вопроса: Да, в Java JDK есть класс «временной интервал».

Для промежутка времени, не привязанного к временной шкале:

Period

Представляет количество дней / недель / месяцев / лет. Может использоваться в расчетах даты, автоматически учитывая переход на летнее время (DST).

Например, чтобы вычесть 3 дня из указанной даты, вы можете сделать

ZonedDateTime threeDaysAgo = Period.ofDays(-3).addTo(ZonedDateTime.now());

Duration

Аналогично Period, но в масштабе дней (как 24-часовые порции, а не календарные дни), часов, минут, секунд и доли секунды.

ChronoUnit

Если вам нужно выполнить вычисления в более широком масштабе (например, включить часы / минуты / секунды и т. Д.), Существует также перечисление ChronoUnit:

ZonedDateTime threeHoursAgo = ChronoUnit.HOURS.addTo(ZonedDateTime.now(), -3);
...