Я бы проанализировал и интерпретировал информацию о часовом поясе отдельно, а затем использовал бы ее для создания объекта Date / Calendar в соответствующем часовом поясе.
Следующий код выглядит достаточно хорошо для вашего примера:
String source = "Wed Aug 17 2011 09:57:09 GMT+0100 (BST)";
String tzid = "GMT" + source.substring(28, 31)
+ ":" + source.substring(31, 33);
TimeZone tz = TimeZone.getTimeZone(tzid);
// if (tz == null) ?
SimpleDateFormat f = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss");
f.setTimeZone(tz);
Date date = f.parse(source);
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
System.out.println(date);
Отпечатки "Wed Aug 17 08:57:09 UTC 2011"
.
Более сложным подходом было бы использование регулярных выражений для извлечения отдельных частей ("+/-", "чч" и "мм") смещения часового пояса.
Кроме того, вы можете попытаться определить трехбуквенный идентификатор часового пояса (строка между (
и )
) и использовать соответствующий Java TimeZone
, если он существует.
В вашем конкретном примере, однако, "BST"
разрешается в Бангладешское время, которое GMT + 0600, так что вам лучше с числовым смещением. "BST"
здесь, вероятно, следует принимать как британское летнее время (GMT + 0100). Это может быть важно, поскольку смещения чисел не указывают на использование перехода на летнее время, которое может действовать в зависимости от даты.
Более эвристическая процедура могла бы принять это во внимание и попытаться сначала разрешить имя, но убедиться, что смещения по Гринвичу совпадают, а в противном случае использовать простой "GMT+hh:mm"
часовой пояс.