2010-03-10 7 views
5

Moja strefa czasowa to CET (Berlin).
I choć DateTime Sprawdzam Joda zauważyli kilka dziwnych rzeczy:Nieparzyste wyniki w Joda Data na 01.04.1893

new DateTime(1893, 4, 1, 0, 0, 0, 0); 
=> java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 

new DateTime(1893, 3, 31, 0, 0, 0, 0).toDate(); 
=> Fri Mar 31 00:06:32 CET 1893 

6 minut 32 sekund przesunięcie strefy czasowej wynikającej z nieistniejącego czasie ??
Muszę powiedzieć, że jest to bardzo nieoczekiwane, ponieważ nie określiłem żadnej informacji o strefie czasowej i dlatego nie spodziewałem się napotkać tego rodzaju problemu.
Jeśli w marcu 1893 roku nie ma CET (Berlin) - dlaczego new DateTime(1893, 3, 31, 0, 0, 0, 0) nie wybiera strefy czasowej pasującej do podanego czasu (tj. 0 minut i 0 sekund)?

Jakie są moje opcje, aby uzyskać prawidłowy czas w programie DateTime?

- EDYT -
Problem wydaje się być toDate(). Zmontowałem go przed opublikowaniem pytania.
sama Joda faktycznie działa prawidłowo:

new DateTime(1893, 3, 31, 0, 0, 0, 0); 
=> 1893-01-01T00:00:00.000+00:53:28 

Tyle, że konwersja do Data przenosi część przesunięciem w minutach i sekundach.

Odpowiedz

10

Jeśli nie określisz strefy czasowej, niestety Joda Time używa systemu. I tak, Berlin really did change w tym czasie (i przez 6 minut i 32 sekundy). Więc określasz czas lokalny, który nie istnieje.

Co masz na myśli, "dlaczego nie [...] wybrałeś strefy czasowej pasującej do podanego czasu?" - strefa czasowa wpływa na sposób mapowania czasu lokalnego na UTC. W strefie czasowej podałeś domyślnie (pozwalając wybrać domyślny system), że czas ten nie istnieje; brak natychmiastowych map UTC do tego czasu lokalnego. Istnieje dowolna liczba stref czasowych, które będą mapować czas lokalny - w jaki sposób Joda będzie wiedziała, którą wybrać?

Zgadzam się, że używanie domyślnej strefy czasowej systemu jest złym posunięciem w części Jody (i jedną naprawiliśmy w Noda Time), ale cała reszta zachowania jest absolutnie w porządku. (Noda Czas ma specyficzny wyjątek dla tego dokładnie sytuacji, aby odróżnić ją od przekazując wartości, które są bardziej oczywiście złe, ale nie idziemy.)

Jeśli nie chcesz, strefy czasowe, aby wejść do niego wcale wtedy powinieneś użyć zamiast tego LocalDateTime.

+5

IOW: To nie jest błąd, to funkcja. Dosłownie. –

+0

Dzięki za linki. Widzę, że CET nie istniało przed tą datą. Widzę, że joda faktycznie tworzy datę poprawnie. Moim problemem wydaje się być konwersja do java.util.Date, która nie obsługuje dobrze zmiany (zobacz moją edycję). Ale to prawdopodobnie większy problem z Date niż DateTime. – Stroboskop

0

Czy próbowałeś zainicjować element za pomocą new DateTime(1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC);?

+0

Nadal chciałbym zachować moją strefę czasową. – Stroboskop

Powiązane problemy