Różnice w prezentacji daty

0

Mam taką sytuację:

2 komputery:

  • jeden linux z jdk-6u3-amd64
  • drugi windows xp jre-6u3

Na pierwszym dla daty wyrażonej za pomocą milisekund: -1956619440000
Otrzymuję datę (java.util.Date):
Wed Jan 01 00:00:00 CET 1908

A na drugim datę (java.util.Date):
Tue Dec 31 23:36:00 CET 1907

Czy ktoś może wyjaśnić skąd się bierze różnica?

Pozdrawiam i z góry dziękuję.
Codi

0

Data -1956619440 sec before 1 Jan 1970 00:00:00 nie jest legalną datą w Linuksie, wg Linuksa świat zaczął się później.

0

To jak rozwiązać następujący problem?:
linux: baza danych + JBOSS -> EJB 3.0 i obiekty Date (encje bazy danych typu TemporalType.Date)
windows: aplikacja komunikująca się z serwerem JBOSS

W bazie danych data jest poprawna np. 1908-01-1
Na serwerze JBOSS po odczytaniu encji data jest 1908-01-01 long: -1956619440000
Po przekazaniu obiektu do klienta (windows) data jest 1907-12-31 long: -1956619440000

Sytuacja została zaobserwowana dla lat 1901-1922.

Proszę o sugestię (jedna już jest - zmienić system operacyjny),
Pozdrawiam
Codi

0

Próbowałem zbadać zagadnienie.

  1. Dawne daty są w Linuksie legalne, swój (pochopny) wniosek sformułowałem na podstawie reakcji Linuksa
    na polecenie

date --date 'dużaLiczba sec ago'

Prawdopodobnie polecenie <i>date</i> jest tak napisane, że <b>-duzaLiczba</b> musi być typu 
<b>int</b>.
  1. 24-minutowa rozbieżność między systemami pojawia się o północy 4 sierpnia 1915 roku, jak się
    dowiedziałem http://4programmers.net/Forum/514803#id514803 wtedy w
    Warszawie zostały przesunięte zegarki o 24 minuty. Linux o tym "wie", Windows nie.
  2. Klient windowsowy winien modyfikować otrzymane "stare" daty o 24601000.
    pozdrawiam
0

Zainteresowało mnie to i pogrzebałem dalej. Linuksy korzystają zazwyczaj z danych zebranych w bazie Olsona [1], nie wiem z czego korzysta Windows. Z tym, że JRE od wersji 1.3.1 również zawiera tę bazę i nie odwołuje się do OS ("The Java SE platform's timezone data is not read from the local or host operating system" [2]).

Pewnym rozwiązaniem mogłoby być wymuszenie stosowania tej samej strefy czasowej na serwerze i u klienta, np. tak

TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
TimeZone.setDefault(tz);

z tym, że to już zależy od konkretnego zastosowania (jeśli klient będzie znajdował się poza naszą strefą to pewnie nie będzie zadowolony z tego, że otrzymuje datę dla Polski).
Można by też spróbować stosować zawsze datę w UTC, lub użyć innej biblioteki, np. Joda Time [3].

[1] http://www.twinsun.com/tz/tz-link.htm
[2] http://java.sun.com/javase/timezones/
[3] http://joda-time.sourceforge.net/index.html

0

Dziękuję bardzo za odpowiedzi i wyjaśnienie rozbieżności.

Spróbuję znaleźć optymalne rozwiązanie dla mojego syetmu.

Pozdrawiam,
Codi

1 użytkowników online, w tym zalogowanych: 0, gości: 1