Не в состоянии понять формат даты "ГГГГ-ММ-ДДЧЧ: ММ: СС" - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь проанализировать следующую строку даты и времени

2018-01-30T23: 59: 59.000

Я не могу понять, какой это стандартный форматкак UTC или ISO_8601

при синтаксическом анализе следующим образом:

SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD'T'HH:MM:SS:MS");
        Date date = null;
        try {
            date = sdf.parse("2018-01-30T23:59:59.000");
        } catch (ParseException e) {
            e.printStackTrace();
        }

Но выдается следующее исключение:

java.text.ParseException: Unparseable date: "2018-01-30T23:59:59.000"

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

См. Документ SimpleDateFormat и попробуйте это:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
0 голосов
/ 10 мая 2018
    LocalDateTime dateTime = LocalDateTime.parse("2018-01-30T23:59:59.000");
    System.out.println(dateTime);

Это печатает:

2018-01-30T23: 59: 59

Ваша строка в формате ISO 8601.UTC или Всемирное координированное время не является форматом, это стандартное время, используемое для определения времени оставшегося использования в наших соответствующих часовых поясах.

Используемые вами классы даты и времени SimpleDateFormat и Date, давно устарели, а первые особенно печально известны.Я рекомендую вместо этого использовать java.time, современный Java API даты и времени.Намного приятнее работать с ним.

A LocalDateTime - это дата с временем суток без часового пояса или смещения от UTC.Его метод parse с одним аргументом анализирует ISO 8601, поэтому явного средства форматирования не требуется.

Что пошло не так в вашем коде

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

Однако, исправляя это, ваш код выдает следующее Date:

Вс 31 декабря 23:00:00 CET 2017

Это один месяц ожидания, а минуты и секунды отсутствуют.Потому что:

  • Прописные буквы YYYY предназначены для недельного года и используются только с номером недели.Вам нужен строчный yyyy для года.
  • Прописный DD для дня года.Вам нужно прописные буквы dd для дня месяца.
  • Вы правильно использовали прописные буквы MM для месяца.Попытка повторить то же самое несколько минут не сработает.Возможно, вы уже можете догадаться: это строчные буквы mm.
  • Не удивительно, что вам нужны строчные буквы ss для секунд.
  • Использование MS для миллисекунд интересно.SimpleDateFormat принимает его как M за месяц (который у нас уже был дважды) и за S за миллисекунду.Вместо этого вам нужно было прописные буквы SSS для трех цифр миллисекунд.

Ссылки

0 голосов
/ 10 мая 2018

Вам нужно экранировать литерал T:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:SS");

См. Этот SO-ответ для дополнительных примеров

Обновление: Ваша строка имеет формат

yyyy-MM-dd'T'HH:mm:ss.SSS

, но вы пытаетесь проанализировать его с помощью строки полностью верхнего регистра.

Это не делает то, что вы хотите, и вам следует прочитать документацию по SimpleDateFormat изаполнители строки формата

...