2012-08-30 13 views
5

Korzystając z biblioteki wersji joda-time-2.0, zastanawiałem się, która z tych funkcji lepiej jest skonstruować z daty ISO (supozycja XML xs:dateTime format): new DateTime(String) kontra DateTime.parse(String).joda-time: new DateTime (String) vs DateTime.parse (String)

Ponieważ oba zwracają inny wynik z tej samej wartości. Przykład:

new DateTime("2012-08-16T07:22:05Z") 
DateTime.parse("2012-08-16T07:22:05Z") 

Wynikające z różnych z powodu ISOChronology. Pierwsza mówi: ISOChronology[Europe/Paris] i druga ISOChronology[UTC], chociaż milisekundy są takie same.

Ponadto, here zaleca używanie ISODateTimeFormat.dateTimeNoMillis(), dając taki sam wynik jak przy użyciu pierwszej wersji (new).

+0

Jakie jest pytanie? – Ilya

+1

Jakiej wersji używasz? –

+0

@Ilaa edytowane pytanie z pogrubioną czcionką. Chociaż wydaje mi się, że to było krystalicznie czyste pytanie ... – lucasvc

Odpowiedz

12

Obie metody wykorzystują dwie różne metody konwersji: konstruktor wykorzystuje instancję InstantConverter, która w przypadku strun jest StringConverter, a które jeszcze nie obsługują czytanie strefę czasową z przetwarzanym łańcuchem, natomiast metoda parse używa DateTimeFormatter, który wie, jak przeanalizować strefę czasową.

Chociaż oba formaty przyjmują teoretycznie format datetime ISO, uważam, że konstruktor jest błędny, ponieważ zawsze używa strefy czasowej systemu, a nie strefy określonej w łańcuchu. Jest to niezgodne z innymi możliwymi wartościami zaakceptowanymi przez tego konstruktora, które uwzględniają chronologię z jej przesunięciem strefy czasowej. Na przykład ten konstruktor zwróci obiekt DateTime ze strefą czasową UTC:

new DateTime(DateTime.parse("2012-08-16T07:22:05Z")) 
+0

Więc lepiej jest użyć 'DateTime.parse', prawda? – lucasvc

+0

Czy konstruktor jest naprawdę błędny, czy strefa czasowa jest ignorowana przez projekt? – Scorpio

+0

Ponieważ strefa czasowa nie jest ignorowana, jeśli zamiast ciągu przekazujemy inny obiekt JodaTime, który ma strefę czasową, powiedziałbym, że jest to błąd, ale powinien zostać potwierdzony przez programistę JodaTime. –