Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top