2015-09-28 7 views
6

Stworzyłem ten wspaniałą metodę statyczną wczoraj, i to działało dobrze - wczorajParsing ISO_INSTANT i podobna data Godzina Struny

Jednak dzisiaj daje mi ten błąd. Myślę, że to od zbyt wielu 0s przed Z.

Może ktoś polecić jak analizować w zwięzły sposób (Java 8) tego typu format daty String - pamiętając, że to działało wczoraj też tak ISO_INSTANT jest również ważny format dla String?

Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed 
at java.time.LocalDate.from(LocalDate.java:368) 
at java.time.LocalDateTime.from(LocalDateTime.java:456) 
... 9 more 

rzuca wyjątek na czas wprowadzania: "2015-09-28T14: 46: 44.000000Z"

/** 
* 
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z") 
* @return 
*/ 
public static LocalDateTime parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return LocalDateTime.from(f.parse(time)); 
} 

enter image description here

+0

ISO_INSTANT nie obsługuje strefy czasowe, mogą być ustalone z czymś takim: 'Instant.from (DateTimeFormatter.ISO_DATE_TIME.parse (" 2017-04-20T00: 00: 00 + 04: 00 "))' –

Odpowiedz

11

Jesteś parsowania ciąg znaków, który jest zgodny z normą ISO chwilę więc trzeba zapisać wynik w Instant zamiast LocalDateTime:

public static Instant parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from); 
} 

Należy zauważyć, że formater obsługuje poprawnie ułamki sekund, więc nie trzeba ich usuwać. Cytowanie DateTimeFormatter.ISO_INSTANT Dokumentacja Javadoc (podkreślenie moje):

Podczas analizowania wymagane jest pole co najmniej sekundy. Ułamkowe sekundy od zera do dziewiątej są analizowane.

Na pytanie dlaczego to działało wczoraj i nie dzisiaj, nie mam pojęcia ...

+0

dzięki, i można to zrobić 'LocalDateTime.from (instant);'? mój kod naprawdę oczekuje formatu LocalDateTime. nanosekundy nie są ważne – ycomp

+2

@ ycomp Możesz skonwertować Instant na LocalDateTime, zobacz [odpowiedź] (http://stackoverflow.com/a/19726814/1743880). – Tunaki

+0

Może właśnie zakodowałem to wczoraj, myślałem, że go uruchomiłem, ale nigdy nie uruchomiłem tego do dzisiaj - nie widzę niczego w moim kodzie, który wskazywałby, że byłem w stanie go uruchomić wczoraj ... więc myślę, że to nigdy nie zadziałało tak, Pierwotnie to zakodowałem – ycomp

3

Właśnie w trosce o pomoc kogoś widząc to pytanie później.

Trzeba przeanalizować Data ISO jako Instant, konwertować je do Instant obiekt, a następnie utworzyć LocalDateTime od niego zapewnienie strefy Id. Ustawiam tutaj identyfikator strefy UTC.

Kod jest następujący

public static LocalDateTime getISODate(String dateString) { 
    DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT; 
    Instant dateInstant = Instant.from(isoFormatter.parse(dateString)); 
    LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId())); 

    return date; 
} 
Powiązane problemy