Преобразовать строку в GregorianCalendar - PullRequest
17 голосов
/ 27 октября 2008

У меня есть строка из заголовка электронного письма, например Date: Mon, 27 Oct 2008 08:33:29 -0700. Что мне нужно, это экземпляр GregorianCalendar, который будет представлять тот же момент. Как это просто - как мне это сделать?

А для самых быстрых - это не будет работать правильно:

SimpleDateFormat format = ... // whatever you want
Date date = format.parse(myString)
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date)

потому что он нормализует часовой пояс к UTC (или времени вашего локального компьютера, в зависимости от версии Java). Что мне нужно, так это calendar.getTimeZone (). GetRawOffset () для возврата -7 * milisInAnHour.

Ответы [ 2 ]

15 голосов
/ 27 октября 2008

Я бы порекомендовал заглянуть в библиотеку Joda Time, если это вариант. Обычно я против использования сторонней библиотеки, когда базовая платформа обеспечивает аналогичную функциональность, но я сделал это исключением, поскольку автор Joda Time также отстает от JSR310, а Joda Time в конечном итоге собирается перейти на Java 7.

http://joda -time.sourceforge.net /

Так или иначе, если Joda Time - вариант, что-то вроде этого должно работать:

DateTimeFormatter formatter =
    DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();

Надеюсь, это поможет.

6 голосов
/ 27 октября 2008

А для самых быстрых - это не сработает должным образом ... потому что это нормализует часовой пояс к UTC (или вашему локальному машинному времени, в зависимости от версии Java). Что мне нужно, так это calendar.getTimeZone (). GetRawOffset () для возврата -7 * milisInAnHour.

Технически, это работает, потому что, хотя он вернет объект с TimeZone, равным текущей системной TimeZone, время будет изменено для учета смещения.

Этот код:

String dateString = "Mon, 27 Oct 2008 08:33:29 -0700";
DateFormat df = new SimpleDateFormat("E, dd MMM yyyy hh:mm:ss Z");
Date parsed = df.parse(dateString);
System.out.println("parsed date: " + parsed);

Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(parsed);

выходы:

дата анализа: пн 27 окт. 11:33:29 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2008

что технически правильно, так как мой системный часовой пояс EDT / UTC минус четыре часа (что на три часа впереди вашего). Если вы выражаете время как число миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу (то есть, как объект Date хранит свою дату / время), тогда эти дата / время равны, это просто TimeZone, который отличается.

Ваша проблема действительно Как мне преобразовать дату / календарь в свой часовой пояс? Для этого взгляните на мой ответ на предыдущий вопрос Как работать с часовыми поясами календаря с помощью Java?

...