Какой класс Java DateTime я должен использовать?

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

Использование в уравнении позволяет добавить интервал времени, получить части значения, как в "if date.month == 2", и почти все макросы datetime в 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 ответа

Решение

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

Я могу быть ужасно неправ, но вы не можете использовать DateTimeFormatter с дополнительными частями в pattern и методе 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

Что касается 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);
Другие вопросы по тегам