Преобразование строки в 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
.
Решение
Я бы порекомендовал заглянуть в библиотеку 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();
Надеюсь, это поможет.
Другие советы
А для самых быстрых - это не сработает...потому что он нормализует часовой пояс до 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
объект хранит свою дату/время), то эти дата/время равны, отличается только часовой пояс.
Ваша проблема действительно Как мне преобразовать дату/календарь в мой часовой пояс? Для этого прочтите мой ответ на предыдущий вопрос. Как обрабатывать часовые пояса календаря с помощью Java?