Ответ 1
Там также javax.xml.bind.DatatypeConverter # parseDateTime (String xsdDateTime), который входит в состав JDK.
Какой лучший способ проанализировать XML dateTime в Java? Официальные значения датыTime включают 2002-10-10T12: 00: 00-05: 00 AND 2002-10-10T17: 00: 00Z
Есть ли хорошая библиотека с открытым исходным кодом, которую я могу использовать, или я должен использовать ее самостоятельно, используя SimpleDateFormat или подобное?
Там также javax.xml.bind.DatatypeConverter # parseDateTime (String xsdDateTime), который входит в состав JDK.
Я думаю, что вы хотите 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
.)
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
См. Параметр и даты dateTime, хотя: -Это принимает "GMT" как часовой пояс по умолчанию -Это не жалуется, если есть конечные непараллельные части -Не принимать во внимание, что TimeZone по умолчанию имеет значение "GMT" в неправильном "GMT + xxxx"
http://xmlbeans.apache.org/samples/DateTime.html
Существует класс XmlDateTime. Просто выполните XMLDateTime.stringToDate(xmlDateTime).
В XML Beans v2 это будет XmlDateTime.Factory.parse(dateTimeString)
, но это неудобно, потому что он ожидает элемент с начальными и конечными тегами, например <mytime>2011-10-20T15:07:14.112-07:00</mytime>
Более простой подход - вызвать (new org.apache.xmlbeans.GDate(dateTimeString)).getDate()
.
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 не определяет тип данных вне текста.
Строка ввода соответствует стандартному форматированию 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 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
и т.д.
В идеале, пакеты обработки XML, которые являются ориентированными на схему (или должны использоваться в качестве основы для вещей), должны предоставлять аксессуры для типизированного контента. Я знаю один (http://woodstox.codehaus.org/), но он пока не предлагает доступ к дате/времени, просто более простые типы (числовые, массивы, QNames и т.д.). Существует запрос на поддержку javax.xml.datatype.XMLGregorianCalendar.
Увы, не многие делают. Тем не менее, вы используете определенный пакет (например, XOM или JDOM и т.д.), Может быть, неплохо было бы задать этот вопрос в своем списке пользователей.
Вы также можете использовать newXMLGregorianCalendar в javax.xml.datatype.DatatypeFactory
, что дает подробный контроль, включая определение того, был ли указан часовой пояс или нет.
Эй, я знаю это немного поздно, но люди, ищущие синтаксический анализ 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();