Три пункта:
- Используйте java .time, современный Java API даты и времени, для своей работы с датой и временем.
- Вместо того, чтобы брать подстрока полученной строки, я бы предпочел проанализировать всю строку.
- Ваша строка шаблона формата должна соответствовать строке, которую вы пытаетесь проанализировать (и наоборот). Точно.
В коде:
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern(
"EEE MMM d uuuu HH:mm:ss 'GMT'xx (zzzz)", // Pattern to match your input strings.
Locale.UK // Locale determines human language used to parse name of month and such.
)
;
String dateString = "Wed Mar 11 2020 05:29:01 GMT+0100 (West Africa Standard Time)";
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateString, formatter);
Создать строку.
System.out.println( zonedDateTime.toString() );
Вывод этого фрагмента:
2020-03-11T03: 29: 01 + 01: 00 [Африка / Лагос]
Использование java .time. С современным API работать гораздо приятнее. Класс Date
, который вы использовали, плохо спроектирован, и SimpleDateFormat
общеизвестно хлопотно. Не используйте ни один из них.
Разбор всей строки. Взятие подстроки длиной 15 заставит некоторых читателей вашего кода задуматься, некоторые спросят «WTF?», Некоторые - используйте свое драгоценное время для подсчета, чтобы убедиться, что 15 правильная длина. Также взять подстроку длиной 15 fr agile, если только вы не уверены, что сокращения дня недели и месяца всегда имеют длину три, а день месяца всегда пишется с двумя цифрами (02 мая, а не 2 мая). Более того, проще разобрать больше, чем вам нужно, и выбросить информацию позже, чем разобрать только то, что вам нужно, а потом обнаружить, что вам нужен еще один бит.
Указание формата. Поскольку ваша строка начинается с сокращения дня недели, вам нужна строка шаблона формата, которая начинается с буквы шаблона формата для дня недели. В этом случае EEE
(или E
или EE
) для аббревиатуры (EEEE
означало бы день, написанный полностью, как Wednesday ). Так что YYYY-MM-dd
все не так. EE MMM dd HH:mm:ss z yyyy
подходит ближе и может анализировать день недели, месяц и день месяца. Затем вводится пробел и год, но вместо этого строка шаблона формата имеет yyyy
для года в конце, так что это то место, где для вас разрыв разбора. Если запись правильной строки шаблона формата дразнит (как это происходит для многих), уловка состоит в том, чтобы попробовать что-то и сначала использовать форматтер для форматирования даты и времени. Если результат отличается от строки, которую мы хотели бы проанализировать, она обычно дает нам подсказку о том, что не так.
Ссылка: Oracle учебник: Дата Время объясняя, как использовать java .time.