Подтвердить что ты не робот

Каков наилучший способ анализа XML dateTime в Java?

Какой лучший способ проанализировать XML dateTime в Java? Официальные значения датыTime включают 2002-10-10T12: 00: 00-05: 00 AND 2002-10-10T17: 00: 00Z

Есть ли хорошая библиотека с открытым исходным кодом, которую я могу использовать, или я должен использовать ее самостоятельно, используя SimpleDateFormat или подобное?

4b9b3361

Ответ 2

Я думаю, что вы хотите ISODateTimeFormat.dateTimeNoMillis() из Joda Time. В целом  Я настоятельно призываю вас держаться подальше от встроенных классов Date/Calendar в Java. Joda Time гораздо лучше спроектирована, поддерживает неизменность (в частности, форматирование является неизменным и потокобезопасным) и является основой для нового API даты/времени в Java 7.

Пример кода:

import org.joda.time.*;
import org.joda.time.format.*;

class Test
{   
    public static void main(String[] args)
    {
        parse("2002-10-10T12:00:00-05:00");
        parse("2002-10-10T17:00:00Z");
    }

    private static final DateTimeFormatter XML_DATE_TIME_FORMAT =
        ISODateTimeFormat.dateTimeNoMillis();

    private static final DateTimeFormatter CHECKING_FORMAT =
        ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);

    static void parse(String text)
    {
        System.out.println("Parsing: " + text);
        DateTime dt = XML_DATE_TIME_FORMAT.parseDateTime(text);
        System.out.println("Parsed to: " + CHECKING_FORMAT.print(dt));
    }
}

Вывод:

Parsing: 2002-10-10T12:00:00-05:00
Parsed to: 2002-10-10T17:00:00.000Z
Parsing: 2002-10-10T17:00:00Z
Parsed to: 2002-10-10T17:00:00.000Z

(Обратите внимание, что на выходе оба заканчиваются как одно и то же время UTC. Выходной формат использует UTC, потому что мы попросили его с вызовом withZone.)

Ответ 3

StaxMan абсолютно прав. Чтобы использовать SimpleDateFormat, вам нужно отключить lax parsing в каждом SimpleDateFormat и перебрать несколько форматов SimpleDateFormat, пока не найдете тот, который анализирует дату, не выбрасывая исключение. Если вы оставите слабый синтаксический анализ, вы склонны к тому, чтобы получить совпадение, когда вы этого действительно не хотели, и лексическое пространство XSD: DateTime оставляет некоторую гибкость в формате, который SimpleDateFormat не может обрабатывать в одном выражении.

XML Schema 1.0 действительно использует ISO 8601, который Joda Time, как предложил Джон Скит, реализует так, что это допустимый вариант.

Если вы хотите сохранить все это в собственных пакетах Java, вы также можете использовать XMLGregorianCalendar в сочетании с DatatypeFactory для синтаксического анализа и создания XSD: строк Datetime.

См. DatatypeFactory.newXMLGregorianCalendar и XMLGregorianCalendar.toXMLFormat

Ответ 4

См. Параметр и даты dateTime, хотя: -Это принимает "GMT" как часовой пояс по умолчанию -Это не жалуется, если есть конечные непараллельные части -Не принимать во внимание, что TimeZone по умолчанию имеет значение "GMT" в неправильном "GMT + xxxx"

Ответ 6

В XML Beans v2 это будет XmlDateTime.Factory.parse(dateTimeString), но это неудобно, потому что он ожидает элемент с начальными и конечными тегами, например <mytime>2011-10-20T15:07:14.112-07:00</mytime>

Более простой подход - вызвать (new org.apache.xmlbeans.GDate(dateTimeString)).getDate().

Ответ 7

TL;DR

Instant instant = Instant.parse( "2002-10-10T17:00:00Z" );
OffsetDateTime odt = OffsetDateTime.parse( "2002-10-10T12:00:00-05:00" );

Подробнее

Другие ответы верны, но теперь устарели. Они используют неприятные старые классы, теперь вытесненные рамкой java.time.

Нет такой вещи, как "XML dateTime". XML не определяет тип данных вне текста.

Использование java.time

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

Instant

Вторая строка ввода заканчивается на Z, короткой для Zulu и означает UTC.

Instant класс представляет момент на временной шкале в UTC с разрешением наносекунд.

String input = "2002-10-10T17:00:00Z":
Instant instant = Instant.parse( input );

OffsetDateTime

Первая строка ввода включает в себя смещение-от-UTC, поэтому мы анализируем как OffsetDateTime.

String input = "2002-10-10T12:00:00-05:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );

ZonedDateTime

Если у вас есть определенный часовой пояс, а не просто смещение от UTC, примените это.

Используйте имя часового пояса в формате continent/region. Никогда не используйте аббревиатуры из 3-4 букв, которые не являются точными часовыми поясами, а не стандартизированы и даже не уникальны (!).

ZoneId zoneId = ZoneId.of( "America/Cancun" );
ZonedDateTime zdt = odt.atZone( zoneId );

О java.time

Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date, .Calendar и java.text.SimpleDateFormat.

Проект Joda-Time, теперь в режиме обслуживания, советует перейти на java.time.

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений.

Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport и далее адаптирована к Android в ThreeTenABP.

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

Ответ 8

В идеале, пакеты обработки XML, которые являются ориентированными на схему (или должны использоваться в качестве основы для вещей), должны предоставлять аксессуры для типизированного контента. Я знаю один (http://woodstox.codehaus.org/), но он пока не предлагает доступ к дате/времени, просто более простые типы (числовые, массивы, QNames и т.д.). Существует запрос на поддержку javax.xml.datatype.XMLGregorianCalendar.

Увы, не многие делают. Тем не менее, вы используете определенный пакет (например, XOM или JDOM и т.д.), Может быть, неплохо было бы задать этот вопрос в своем списке пользователей.

Ответ 9

Вы также можете использовать newXMLGregorianCalendar в javax.xml.datatype.DatatypeFactory, что дает подробный контроль, включая определение того, был ли указан часовой пояс или нет.

Ответ 10

Эй, я знаю это немного поздно, но люди, ищущие синтаксический анализ XML в 2015 году, в Java 7 вы можете использовать

javax.xml.datatype.DatatypeFactory

чтобы получить объект Calendar

вот как я это сделал.

private Calendar mPublishDate;
DatatypeFactory dtf=DatatypeFactory.newInstance();
this.mPublishDate=dtf.newXMLGregorianCalendar(mPublishDate/*date time string extracted from xml*/).toGregorianCalendar();