Приносит ли java .time значение DateTimeFormatters по умолчанию для таких шаблонов, как «гггг-мм-дд», «чч: мм: сс» или аналогичных вариантов? - PullRequest
1 голос
/ 17 апреля 2020

Я обнаружил, что повторяю снова и снова один и тот же шаблон кода. Я использую какой-то объект даты / времени (Java 8 API), и в итоге мне приходится выкатывать свой собственный DateTimeFormatter:

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
DateTimeFormatter.ofPattern("yyyy-MM-dd")
DateTimeFormatter.ofPattern("HH:mm:ss")

, что хорошо, но ... меня это достает интересно, не сделано ли уже готовых для меня? Я взглянул на те, которые есть в DateTimeFormatter синглтоне, но они, похоже, не очень помогают.

Ответы [ 2 ]

4 голосов
/ 17 апреля 2020

Я думаю, что документация из DateTimeFormatter вполне понятна. Упомянутые вами конкретные шаблоны поддерживаются следующими предопределенными константами:

yyyy-MM-dd => ISO_LOCAL_DATE

HH:mm:ss => ISO_LOCAL_TIME

Только ваш первый пример "гггг-ММ-дд ЧЧ: мм: сс" не соответствует ни одному из заранее определенных средств форматирования, поэтому вы можете просто создать его, указав шаблон (как вы уже сделали). ISO_LOCAL_DATE_TIME очень похож, но заменяет пробел на ISO-литерал "T".

3 голосов
/ 17 апреля 2020

гггг-мм-дд ЧЧ: мм: сс: сборка из встроенных деталей

В дополнение к хорошему ответу Мено Хохшильда.

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")

Несмотря на то, что он не встроен в том виде, в каком он есть (хотя он и происходит регулярно), я предпочитаю собирать его из двух предопределенных форматеров, упомянутых в этом другом ответе, а не писать собственную строку шаблона формата:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();

ISO_LOCAL_TIME принимает и печатает форматы, отличные от HH:mm:ss. С одной стороны, он принимает формат без каких-либо секунд (HH:mm), с другой стороны, секунды с долей до 9 десятичных знаков (например, HH:mm:ss.SSSSSSSSS). Это часто преимущество; но если вы хотите выполнить строгую проверку проанализированной строки или хотите, чтобы строка выводилась в согласованном формате, это, конечно, недостаток.

Или использовать String.replace (char, char)

Другие будут форматировать и анализировать LocalDateTime объекты в и из yyyy-MM-dd HH:mm:ss формата без какого-либо явного средства форматирования, полагаясь на его сходство с форматом ISO 8601, также упомянутым Мено Хохшильдом.

    String str = "2020-04-17 20:23:30";
    LocalDateTime ldt = LocalDateTime.parse(str.replace(' ', 'T'));
    System.out.println(ldt);

Вывод:

2020-04-17T20: 23: 30

И наоборот:

    LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Tehran"));
    String str = now.truncatedTo(ChronoUnit.SECONDS)
            .toString()
            .replace('T', ' ');
    System.out.println(str);

2020-04-18 09: 35: 38

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...