Как я могу использовать Java SimpleDateFormat для анализа часового пояса, указанного как «GMT + 0100 (BST)»? - PullRequest
2 голосов
/ 17 августа 2011

У меня есть дата в виде:

Wed Aug 17 2011 09:57:09 GMT+0100 (BST) 

, и у меня есть фильтр, который занимает время в определенном формате.Кажется, проблема в часовом поясе в конце, ни одна из строк формата, которые я вставляю в фильтр, кажется, не работает для этого типа формата даты.

Например,

Wed Aug 17 2011 09:57:09 GMT+0100 (BST)
EEE MMM dd yyyy HH:mm:ss zZ?

Часть этого часового пояса продолжает выдавать ошибку.

Может кто-нибудь сказать мне, какой правильный формат для разбора часовых поясов в эти даты?

Ответы [ 3 ]

6 голосов
/ 17 августа 2011

"z" нужно двоеточие между часами и минутами.«Z» - это всего лишь +/- ЧЧММ (то есть без префикса «GMT»).

Один из способов его анализа: EEE MMM dd yyyy HH:mm:ss 'GMT'Z.Бит "BST" игнорируется, и он основан на предположении, что перед смещением всегда есть "GMT".

1 голос
/ 17 августа 2011

Я бы проанализировал и интерпретировал информацию о часовом поясе отдельно, а затем использовал бы ее для создания объекта 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" часовой пояс.

0 голосов
/ 30 мая 2013

Если вы не можете найти шаблон, соответствующий вашему варианту использования, попробуйте:

try{
    new Date("Wed Aug 17 2011 09:57:09 GMT+0100 (BST)")
}catch(Exception e)
{
  // Parse exception
}
...