У меня есть строка из заголовка электронной почты, например 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.
@ Даниэль: Не обязательно. Это зависит от того, взаимодействует ли приложение, работающее в Индии, с индийскими, форматами дат ISO, другими нелокализованными процессами или с чем-то еще.
Хотя я согласен с тем, что вам следует использовать Calendar.getInstance (и вы должны использовать обобщенный тип Calendar, а не GregorianCalendar) ... getInstance () возвращает не-GregorianCalendar, только если ваш язык / страна тайский / Таиланд!




Я бы порекомендовал заглянуть в библиотеку 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();
Надеюсь, это поможет.
Если вы делаете что-то отдаленно сложное с манипуляциями с датой и временем, и это похоже на вас, я также настоятельно рекомендую библиотеку Joda Time. Это одна из лучших разработанных и реализованных библиотек, которые я когда-либо видел, и она делает обработку даты / времени максимально простой (но не более простой).
Привет, Джек, это хороший ответ! У него только одна ошибка - вот правильная строка. Обновите, и я приму это. DateTimeFormat.forPattern («ваш шаблон»). WithOffsetParsed ();
And for the fastest ones -- this is not going to work properly ... because it will normalize the timezone to UTC (or your local machine time, depending on Java version). What I need is calendar.getTimeZone().getRawOffset() to return -7 * milisInAnHour.
Технически это работает, потому что, хотя он вернет объект с часовым поясом, равным текущему системному часовому поясу, время будет изменено с учетом смещения.
Этот код:
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);
выходы:
parsed date: Mon Oct 27 11:33:29 EDT 2008
что технически правильно, так как мой системный часовой пояс EDT / UTC минус четыре часа (что на три часа опережает ваш). Если вы выразите время как количество миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу (именно так объект Date хранит свою дату / время), тогда эти дата / время равны, это просто часовой пояс, который отличается .
Ваша проблема действительно Как мне преобразовать дату / календарь в мой часовой пояс? Для этого взгляните на мой ответ на предыдущий вопрос Как управлять часовыми поясами календаря с помощью Java?
Незначительное в сторону: вы должны использовать Calendar.getInstance (), а не напрямую создавать экземпляр GregorianCalendar. Это остается гибким, так что вам не нужно менять весь свой код, когда ваше приложение запускается в Индии (например,).