2016-01-06 13 views
8

Kolon olmadan ofset veya kolon olmadan ofset kabul edebilen bir DateTimeFormatter oluşturmaya çalışıyorum.Java DateTime İsteğe bağlı bir kolon ayırıcı ile saat dilimi için daha yüksek değer mi var?

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[X]"); 
dateTimeFormatter.parse("2015-01-28T10:21:44+0100"); // OK 
dateTimeFormatter.parse("2015-01-28T10:21:44+01:00"); // KO 
+0

İsteğe bağlı olmasını düşündüğünüz kolon, bölge ofset bölümünün bir parçasını sabitler. Sadece desen harfleri X (iki nokta üst üste) veya XXX (iki nokta üst üste) arasından seçim yapabilirsiniz. Yani tüm bölge ofseti opsiyoneldir, sadece içindeki kolon değildir. –

+0

Katılıyorum, işe yaramalı. Ancak [X] kullandığımda, kolonsuz bir ofset olmasını beklerim ve [XXX] kullandığımda, kolonlu bir ofset olmasını bekler. İkisini birlikte kullanamam. –

+0

Javadoc'a göre: X sembolü ile birlikte örnekler verilmiştir: Z; -08; -0830; -08: 30; -083.015; -08: 30: 15; –

cevap

10

Bu: yyyy-MM-dd'T'HH:mm:ss[XXX][X] iş gibi görünüyor

bu testi geçmek için bir yol var mı.

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[XXX][X]"); 
dateTimeFormatter.parse("2015-01-28T10:21:44+0100"); 
dateTimeFormatter.parse("2015-01-28T10:21:44+01:00"); 

Here is an example

+1

Evet, işe yarıyor! [X] [XXX] 'i (çalışmamayı) denedim, ancak [XXX] [X]' i değil. Teşekkürler! –

+0

@NelsonG. Rica ederim. İyi şanslar. – Titus

+1

Tek egzotik bir görünüm: Girişte TWO ofsetleri varsa, bu da ayrıştırılabilir. –

8

İşte ISO dize tarih gibi bakarak oldukça her şey için eşleştirme nihai kalıptır!

Ben hala neden bilmiyorum yorumlarda ama iki haricinde testlerin aşağıdaki listede için çalışır
"[yyyyMMdd][yyyy-MM-dd][yyyy-DDD]['T'[HHmmss][HHmm][HH:mm:ss][HH:mm][.SSSSSSSSS][.SSSSSS][.SSS][.SS][.S]][OOOO][O][z][XXXXX][XXXX]['['VV']']" 

...

ZonedDateTime dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00:00[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+020000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0200[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993Z[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993GMT+1[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993UTC[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993PST[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993[Europe/Paris]"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08+02:00[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+020000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0200[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08Z[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08GMT+1[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08UTC[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08PST[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08[Europe/Paris]"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+020000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0200"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993Z"); 
    //dt = DateTimeUtils.parse("2016-10-27T16:36:08.993GMT+1"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993UTC"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993PST"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.000993"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.000000993"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08+02:00:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+02:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+020000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0200"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08Z"); 
    //dt = DateTimeUtils.parse("2016-10-27T16:36:08GMT+1"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08UTC"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08PST"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08"); 

    dt = DateTimeUtils.parse("2016-100T16:36:08Z"); 
    dt = DateTimeUtils.parse("2016-100T16:36.1Z"); 
    dt = DateTimeUtils.parse("2016-10-27"); 

    dt = DateTimeUtils.parse("20161223T163608"); 
    dt = DateTimeUtils.parse("20161223T1636"); 

Ve ayrıştırma yöntemi kendisi:

public static ZonedDateTime parse(CharSequence text) { 
    TemporalAccessor temporalAccessor = LOOSE_ISO_DATE_TIME_ZONE_PARSER.parseBest(text, ZonedDateTime::from, LocalDateTime::from, LocalDate::from); 
    if (temporalAccessor instanceof ZonedDateTime) { 
     return ((ZonedDateTime) temporalAccessor); 
    } 
    if (temporalAccessor instanceof LocalDateTime) { 
     return ((LocalDateTime) temporalAccessor).atZone(ZoneId.systemDefault()); 
    } 
    return ((LocalDate) temporalAccessor).atStartOfDay(ZoneId.systemDefault()); 
} 
+0

GMT'den sonra "+1" için yiyecek almadığınız için yorumda olanlar için işe yaramadığını varsayalım. Verilmiş, bu ifadeleri tanımıyorum, ama "+" için herhangi bir yemek yok gibi görünüyor - herhangi bir yere imzalamak? – junkfoodjunkie

+0

GMT + 1'i bir bütün olarak tanımalı, 2016-10-27T16: 36: 08.993GMT + 1 [Avrupa/Paris] için olduğu gibi. –

+0

Tamam - Avrupa/Paris, metin ile birlikte sona eriyor, ancak çalışmayanlar "+1" ile bitiyor - orada bir şey olabilir :) – junkfoodjunkie