Java - формат даты для нескольких сценариев - PullRequest
0 голосов
/ 08 мая 2019

У меня есть Java-компонент для форматирования даты, которую я получаю. Вот мой код:

    Format formatter      = new SimpleDateFormat("yyyyMMdd");
        String s = "2019-04-23 06:57:00.0";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss.S");
        try
        {
            Date date = simpleDateFormat.parse(s);
            System.out.println("Formatter: "+formatter.format(date));
        }
        catch (ParseException ex)
        {
            System.out.println("Exception "+ex);
        }   

Код прекрасно работает, пока String s имеет формат "2019-04-23 06:57:00.0";

Мой вопрос: как настроить этот код, чтобы он работал для следующих сценариев ex, моя строка s может иметь значения типа


String s = "2019-04-23 06:57:00.0";
or 
String s = "2019-04-23 06:57:00";

Or 
String s = "2019-04-23";

Прямо сейчас это не получится, если я не передам мс .. Спасибо!

Ответы [ 2 ]

4 голосов
/ 08 мая 2019

Разные виды

String s = "2019-04-23 06:57:00";

String s = "2019-04-23";

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

* +1012 *LocalDateTime.parse

Для соответствия стандартному формату ISO 8601 , используемому по умолчанию в классе LocalDateTime, замените ПРОБЕЛ в середине на T. Я предлагаю вам обучить издателя ваших данных использованию только форматов ISO 8601 при обмене значениями времени и даты в виде текста.

LocalDateTime ldt1 = LocalDateTime.parse( "2019-04-23 06:57:00".replace( " " , "T" ) ) ;

Дробная секунда также разбирается по умолчанию.

LocalDateTime ldt2 = LocalDateTime.parse( "2019-04-23 06:57:00.0".replace( " " , "T" ) ) ;

См. Этот код, запущенный на IdeOne.com .

ldt1.toString (): 2019-04-23T06: 57

ldt2.toString (): 2019-04-23T06: 57

LocalDate.parse

Ваш ввод только для даты уже соответствует ISO 8601 .

LocalDate ld = LocalDate.parse( "2019-04-23" ) ;

См. Этот код, запущенный на IdeOne.com .

ld.toString (): 2019-04-23

Дата с указанием времени суток

Вы можете убрать время суток с даты.

LocalDate ld = ldt.toLocalDate() ;

И вы можете добавить его обратно.

LocalTime lt = LocalTime.parse( "06:57:00" ) ;
LocalDateTime ldt = ld.with( lt ) ;

Момент

Однако, имейте в виду, что LocalDateTime не не представляет момент, является не точкой на временной шкале. Без контекста часового пояса или смещения от UTC , LocalDateTime не может удерживать мгновение, как объяснено в своем классе JavaDoc.

На мгновение используйте классы ZonedDateTime, OffsetDateTime или Instant. Научите издателя ваших данных включать смещение, предпочтительно в UTC.

enter image description here

Избегайте устаревших классов даты и времени

Старые классы SimpleDateFormat, Date и Calendar ужасны, изобилуют неудачным выбором дизайна, написанным людьми, неопытными в обработке даты и времени. Они были вытеснены несколько лет назад современными java.time классами, определенными в JSR 310 .

1 голос
/ 09 мая 2019

Если у вас есть дополнительные детали в шаблоне, вы можете использовать [ и ].

Например

public static Instant toInstant(final String timeStr){
    final DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("yyyy-MM-dd HH[:mm[:ss[ SSSSSSSS]]]")
            .withZone(ZoneId.of("UTC"));
    try {
        return Instant.from(formatter.parse(timeStr));
    }catch (DateTimeException e){
        final DateTimeFormatter formatter2 = DateTimeFormatter
                .ofPattern("yyyy-MM-dd")
                .withZone(ZoneId.of("UTC"));
        return LocalDate.parse(timeStr, formatter2).atStartOfDay().atZone(ZoneId.of("UTC")).toInstant();
    }
}

чехол

  • yyyy-MM-dd
  • yyyy-MM-dd HH
  • yyyy-MM-dd HH:mm
  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd HH:mm:ss SSSSSSSS
...