Преобразование строки в 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.

Незначительное в сторону: вы должны использовать Calendar.getInstance (), а не напрямую создавать экземпляр GregorianCalendar. Это остается гибким, так что вам не нужно менять весь свой код, когда ваше приложение запускается в Индии (например,).

Daniel Spiewak 27.10.2008 19:39

@ Даниэль: Не обязательно. Это зависит от того, взаимодействует ли приложение, работающее в Индии, с индийскими, форматами дат ISO, другими нелокализованными процессами или с чем-то еще.

erickson 27.10.2008 19:54

Хотя я согласен с тем, что вам следует использовать Calendar.getInstance (и вы должны использовать обобщенный тип Calendar, а не GregorianCalendar) ... getInstance () возвращает не-GregorianCalendar, только если ваш язык / страна тайский / Таиланд!

matt b 27.10.2008 20:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
17
3
48 923
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы порекомендовал заглянуть в библиотеку 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. Это одна из лучших разработанных и реализованных библиотек, которые я когда-либо видел, и она делает обработку даты / времени максимально простой (но не более простой).

Dov Wasserman 28.10.2008 07:28

Привет, Джек, это хороший ответ! У него только одна ошибка - вот правильная строка. Обновите, и я приму это. DateTimeFormat.forPattern («ваш шаблон»). WithOffsetParsed ();

Marcin 28.10.2008 12:57

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?

Другие вопросы по теме