Подтвердить что ты не робот

Преобразование строки в GregorianCalendar

У меня есть строка из заголовка электронной почты, например 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.

4b9b3361

Ответ 1

Я бы рекомендовал заглянуть в библиотеку времени Joda, если это вариант. Обычно я не использую стороннюю библиотеку, когда базовая платформа обеспечивает аналогичную функциональность, но я сделал это исключением, потому что автор 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();

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

Ответ 2

И для самых быстрых - это не будет работать должным образом... потому что он нормализует часовой пояс для 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 EDT 2008

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

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