Вопрос по java – как преобразовать тип dateTime в gregorianCalendar

3

Я получаю время в строке вроде этого & quot; 2011-02-27T10: 03: 33.099-06: 00 & quot; который имеет тип xml dateTime. У меня также есть часовой пояс типа TimeZone. Как мне преобразовать dateTime в Java-тип GregorianCalendar в этом часовом поясе.

Я думаю, что вы найдете решение здесь:stackoverflow.com/questions/240510/… Paulius Matulionis

Ваш Ответ

3   ответа
0

tl;dr

OffsetDateTime.parse( "2011-02-27T10:03:33.099-06:00" )

java.time

Современный подход используетjava.time классы, которые вытеснили проблемные старые классы даты и времени. В частности,GregorianCalendar был замененZonedDateTime для часового пояса, иOffsetDateTime для простого смещения от UTC.

ISO 8601

Ваша входная строка соответствуетISO 8601 стандартный формат.

java.time классы используют эти стандартные форматы по умолчанию при разборе / генерации строк. Поэтому нет необходимости указывать шаблон форматирования.

OffsetDateTime

Ваша входная строка содержитофсетным из-UTC, но нечасовой пояс, Так что разбери какOffsetDateTime.

OffsetDateTime odt = OffsetDateTime.parse( "2011-02-27T10:03:33.099-06:00" ) ;

ZonedDateTime

Если вы точно знаете предполагаемый часовой пояс, применитеZoneId производитьZonedDateTime.

Часовой пояс всегда предпочтительнее простого смещения. Зона - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона.

Укажитеправильное название часового пояса в форматеcontinent/region, такие какAmerica/Montreal, Africa/Casablanca, или жеPacific/Auckland, Никогда не используйте 3-4 буквенное сокращение, такое какEST или жеIST как они естьnot настоящие часовые пояса, не стандартизированные и даже не уникальные (!).

ZoneId z = ZoneId.of( "Pacific/Galapagos" ) ;  
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

Converting legacy ↔ modern

Если вы должны иметьGregorianCalendar объект для взаимодействия со старым кодом, который еще не обновлен доjava.timeВы можете конвертировать. Посмотрите на новые методы, добавленные к старым классам.

GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;

И идти в другом направлении & # x2026;

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

About java.time

java.time фреймворк встроен в Java 8 и выше. Эти классы вытесняют хлопотное староенаследие классы даты и времени, такие какjava.util.Date, Calendar& amp;SimpleDateFormat.

Joda-Time проект, сейчас вРежим технического обслуживанияПосоветует миграцию наjava.time классы.

Чтобы узнать больше, см.Oracle Tutorial, И поиск переполнения стека для многих примеров и объяснений. СпецификацияJSR 310.

ИспользуяДрайвер JDBC совместимый сJDBC 4.2 или позже, вы можете обменятьjava.time объекты непосредственно с вашей базой данных. Нет необходимости ни в строках, ни в java.sql. * Классах.

Где взять классы java.time?

ThreeTen-Extra Проект расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие какInterval, YearWeek, YearQuarter, а такжеБольше.

2

Java имеет встроенный код для разбора даты и времени xml: используйтеDatatypeConverter.parseDateTime (), это вернет календарь в разобранном часовом поясе. Затем вы можете установить Календарную Часовую Зону на желаемую целевую Часовую Зону для всего, что вам нужно делать дальше.

2
sdf = new java.text.SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss.S");

разбирает все, кроме висящего ТЗ.

sdf.parse (sd);
res168: java.util.Date = Sun Feb 27 10:03:33 CET 2011

ОтApi DocsЯ бы ожидал

sdf = new java.text.SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss.SSSz");

использоваться для чтения -06: 00 в конце. Но я вижу, что ожидается либо смещение в ожидаемой форме 0700, либо с префиксом GMT, например «GMT-04: 00». Таким образом, вы должны вставить эту GMT-штуку самостоятельно:

sdf.parse (sd.replaceAll ("(......)$", "GMT$1"))

SDF.parse (str) возвращает дату, которая должна быть преобразована в GC:

GregorianCalendar calendar = new GregorianCalendar ();
calendar.setTime (date);
В Java 7 теперь вы можете использовать & quot; X & quot; вместо "Z" который использует формат часового пояса ISO 8601 (например, -06, -0600, -06: 00).
получение исключения разбора при этом: SimpleDateFormat sDF = new SimpleDateFormat («гггг-ММ-дд» Т »ЧЧ: мм: сс.Сз»); Дата resultDate = sDF.parse (& quot; 2012-02-27T10: 03: 33.099-06: 00 & quot;); vjk
@vjk: да, это должно бытьresultDate = sDF.parse("2012-02-27T10:03:33.099-06:00".replaceAll("(......)$", "GMT$1")); с а) вставкой GMT перед смещением времени и с 3-мя местами для доли секунды «SSSz»; в конце.

Похожие вопросы