Один из подходов состоит в том, чтобы использовать обычные методы манипуляции со строками для перевода вашей строки из формы, которую вы ожидаете, в форму, которую SimpleDateFormat
поймет.Вы не сказали точно, какой диапазон форматов часовых поясов является приемлемым, но одна возможность выглядит примерно так:
private static Date parse(String dateString) throws ParseException
{
final SimpleDateFormat dateFormat =
new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss Z");
dateString = dateString.replaceAll("(GMT[+-])(\\d)$", "$1\\0$2");
dateString = dateString.replaceAll("(GMT[+-]\\d\\d)$", "$1:00");
return dateFormat.parse(dateString);
}
Это будет поддерживать GMT плюс-или-минус одно- или двухзначное числочасовое смещение, в дополнение к поддержке чего-либо, уже поддерживаемого SimpleDateFormat
, такого как EST
или GMT+1030
.
В качестве альтернативы, если вы знаете, что это всегда будет GMT, тогда вы можете просто установить время-zone в форматере и игнорируйте часовой пояс в строке:
private static Date parse(String dateString) throws ParseException
{
final SimpleDateFormat dateFormat =
new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat.parse(dateString);
}
Вы также можете разделить разницу.Я заметил, что формат часового пояса в вашей строке соответствует ожидаемому TimeZone.getTimeZone()
.Это намеренно?Если это так, вы можете извлечь этот формат часового пояса из строки, передать его заранее dateFormat.setTimeZone
, а затем проигнорировать его во время фактического анализа:
private static Date parse(final String dateString) throws ParseException
{
final SimpleDateFormat dateFormat =
new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
if(dateString.indexOf("GMT") > 0)
dateFormat.setTimeZone
(
TimeZone.getTimeZone
(dateString.substring(dateString.indexOf("GMT")))
);
return dateFormat.parse(dateString);
}