Soru Java'da XML dateTime ayrıştırmanın en iyi yolu nedir?


Java'da XML dateTime ayrıştırmanın en iyi yolu nedir? Yasal dateTime değerleri arasında 2002-10-10T12: 00: 00-05: 00 AND 2002-10-10T17: 00: 00Z

Kullanabileceğim iyi bir açık kaynak kütüphanesi var mı, yoksa SimpleDateFormat veya benzerlerini kullanarak kendi başıma mı dönmeliyim?


44
2018-05-26 05:12


Menşei




Cevaplar:


Ayrıca var javax.xml.bind.DatatypeConverter # parseDateTime (Dize xsdDateTime)JDK'nın bir parçası olarak geliyor.


72
2018-04-20 15:20



Bunu başka bir kitaplığa eklemeden en kolay yolu buldum. Teşekkürler! - mlaccetti
Bu doğru cevap ve tek bir astar - bestsss
Bu iyi, ancak zaman damgası olmayan 'dateTime' değerlerine ve 'dateTimeStamp' değerlerine zaman damgalarıyla izin verir. Birini veya diğerini istemek için herhangi bir yolu var mı? - Rich


İstediğini düşünüyorum ISODateTimeFormat.dateTimeNoMillis() itibaren Joda zamanı. Genel olarak  İsterim şiddetle Java'da yerleşik Tarih / Takvim sınıflarından uzak durmanızı tavsiye ederiz. Joda Time çok daha iyi tasarlanmış, değişmezlikten yanadır (özellikle formatlar değişmez ve thread-safe) ve Java 7'deki yeni tarih / zaman API'sinin temelidir.

Basit kod:

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));
    }
}

Çıktı:

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

(Çıkışın her ikisinin de aynı UTC zamanı olarak bittiğini unutmayın. Biçimlendirilen çıkış UTC'yi kullanır; withZone aramak.)


39
2018-05-26 06:17



Bu çok yardımcı oldu! Orijinal zaman dilimi ofsetini korumak için DateTimeFormatter'ı kullandım XML_DATE_TIME_FORMAT = ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed() - Diego Medaglia


StaxMan kesinlikle doğru. SimpleDateFormat'ı kullanabilmek için, her bir SimpleDateFormat öğesinde lax ayrışmasını kapatmanız ve bir olayı atmadan tarihi ayrıştıranı bulana kadar birkaç SimpleDateFormat biçimi üzerinde yinelemeniz gerekir. Eğer ayrıştırmadan ayrılırsanız, gerçekten istemediğiniz bir eşleşme elde etmeye eğilimlisiniz ve XSD'nin sözcüksel uzayı: DateTime SimpleDateFormat'ın tek bir ifadede işleyemediği biçimdeki bazı esneklikleri bırakır.

XML Şema 1.0 gerçekten de Jon Skeet'in önerdiği gibi Joda Time'ın geçerli bir seçenek olması için uyguladığı ISO 8601'i kullanıyor.

Hepsini yerel Java paketlerinde tutmak istiyorsanız, ayrıca XMLGregorianCalendar ile birlikte DatatypeFactory XSD ayrıştırmak ve oluşturmak için: Datetime dizeleri.

DatatypeFactory.newXMLGregorianCalendar ve XMLGregorianCalendar.toXMLFormat sayfasına bakın.


6
2018-05-26 14:48





Görmek DateTime değerlerini ayrıştır ve biçimlendir, olmasına rağmen: - Varsayılan saat dilimi olarak "GMT" değerini alır - Ayrılmaz parçanın bulunup bulunmadığı konusunda şikayet etmez. -ZamanZone'nun yanlış "GMT + xxxx" üzerinde "GMT" ye ayarlandığını dikkate almaz


2
2018-04-11 08:31





http://xmlbeans.apache.org/samples/DateTime.html

XmlDateTime sınıfı var. Sadece XMLDateTime.stringToDate (xmlDateTime) yapın.


1
2018-03-29 17:26





XML Fasulye'de v2 olurdu XmlDateTime.Factory.parse(dateTimeString)ama bu garip çünkü başlangıç ​​ve bitiş etiketleri gibi bir öğe bekliyor <mytime>2011-10-20T15:07:14.112-07:00</mytime>

Daha kolay bir yaklaşım aramaktır (new org.apache.xmlbeans.GDate(dateTimeString)).getDate().


1
2017-10-21 17:29





tl; Dr.

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

ayrıntılar

Diğer Cevaplar doğru ama şimdi modası geçmiş. Şimdi java.time çerçevesi tarafından desteklenen sorunlu eski sınıflar kullanıyorlar.

“XML dateTime” diye bir şey yok. XML metin dışındaki herhangi bir veri türünü tanımlamaz.

Java.time kullanarak

Giriş dizesiyle uyuşuyor ISO 8601 standart biçimlendirme. Dolayısıyla, java.time sınıfları dizeleri ayrıştırırken / üretirken varsayılan olarak ISO 8601'i kullandıkça bir biçimlendirme deseni belirtmeye gerek yoktur.

Instant

İkinci giriş dizesi bir Z, kısa Zuluve araçlar UTC.

Instant sınıf, zaman çizelgesinde bir anı temsil eder UTC bir karar ile nanosaniye.

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

OffsetDateTime

İlk giriş dizesi, UTC'den bir ofset içerir; OffsetDateTime.

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

ZonedDateTime

Belirli bir zaman diliminiz varsa, sadece UTC'den bir ofset yerine, bunu uygulayın.

Kullanın uygun saat dilimi adı biçiminde continent/region. Asla gerçek zaman dilimleri olmayan, standartlaştırılmamış ve benzersiz bile olmayan 3-4 harfli kısaltmaları kullanmayın (!).

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

Java.time hakkında

java.time çerçeve Java 8 ve daha sonra yerleşiktir. Bu sınıflar, eski zahmetli tarih-zaman derslerini tamamlar. java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Joda-Time proje, şimdi Bakım Modujava.time'a geçişi önerir.

Daha fazla bilgi için bkz. Oracle Eğitimi. Ve birçok örnek ve açıklamalar için Stack Overflow'u arayın.

Java.time işlevselliğinin çoğu, Java 6 ve 7'ye geri taşınmıştır. ThreeTen-backport ve daha fazlası için Android içinde ThreeTenABP.

ThreeTen-Ekstra Proje java.time ek sınıfları ile genişletir. Bu proje java.time için gelecekteki olası eklemeler için kanıtlanmış bir zemin. Burada bazı yararlı sınıflar bulabilirsiniz. Interval, YearWeek, YearQuarter, ve dahası.


1
2017-08-14 22:52



XMLSchema, dateTime türünü tanımlar. w3.org/TR/xmlschema-2/#dateTime - Thomas W