sobota, 24 września 2011

java.util.Calendar a sprawa Polska, czyli gdzie są moje 24 minuty?

Jako członek rady programowej tegorocznej konferencji Java Developers' Day mam zaszczyt zaprosić Was do konkursu na śmieszną (może przez łzy) i ciekawą (może pouczającą) anegdotę z codziennej pracy.

Strona konkursu Z pamiętnika dewelopera historii kilka… zawiera szczegółowy regulamin i opis nagród. Planujemy dodatkowo podczas konferencji umożliwić podzielenie się swoimi "przygodami" w formie stand up comedian:)



//====================================

Gdyby ktoś z lenistwa nie kliknął linka pod którym znajdują się zgłoszone historyjki, to zamieszczam kopię własnej:

Tytuł: java.util.Calendar a sprawa Polska, czyli gdzie są moje 24 minuty?

Problem:

Duży system, w którym klientem do serwera były applety. Na wielu formularzach istnieje możliwość edycji czasu pewnych zdarzeń. Czas edytowany przez zwykłe pole tekstowe w formacie godzina:minuty. Niestety, na niektórych formularzach można zaobserwować następujące schorzenie: wpisujemy pewien czas, zapisujemy, następnie gdy ponownie edytujemy rekord, czas jest zawsze cofnięty o 24 minuty! Liczba 24 kojarzy się każdemu z ilością godzin w dobie tak więc jest to doskonale zwodnicza wartość…

Tło techniczne:

Czas – z powodów, które pamiętają już tylko prastarzy Słowianie programujący w technologiach z epoki krzemu łupanego – był zapisywany w bazie danych jako: 01.01.1900 godzina_z_formularza:minuta_z_formularza:00.000

Kluczowy jest tutaj pierwszy stycznia roku 1900.

Zapis i odczyt działały poprawnie. Komunikacja applet – serwisy serwera poprzez Spring Remoting (zdalne wywołanie metod Beanów Springa, serializacja paramentów i wyników i wyjątków).
Czas był przesyłany w DTOsach w postaci obiektów klasy java.util.Calendar (służącej lepiej lub gorzej do manipulacji czasem) zamiast java.util.Date (służącej jako kontener na czas).
Calendar jest o tyle sprytną klasą, że jej obiekty badają lokalizację systemu operacyjnego na którym żyją. W przypadku podpisanych appletów robiły to na maszynach klienckich po ich przesłaniu i deserializacji.

Warto wiedzieć:

Po tygodniu poszukiwań okazało się, że głęboko w kodzie kalendarza istnieje logika, która uwzględnia następujący fakt: pewnego dnia w 1904 4. sierpnia 1915 roku na terenie Polski dokonano standaryzacji czasu, tak aby dopasować go do globalnych stref czasowych i przesunięto wówczas wskazówki o 24 minuty:)

A panowie z Suna (niestety) odrobili lekcje z historii…

5 komentarzy:

Marcin Łępicki pisze...

Manipulacje czasem to ciężki temat - strefy czasowe, historyczne zdarzenia jak znikające tygodnie, bieżące zdarzenia jak decyzje niektórych państw dotyczące likwidacji czasu letniego, sekundy przestępne i pewnie dużo innychs

Krzysztof Kocel pisze...

A czy można poprosić o źródła? Nie mogłem dokopać się do żadnych informacji w sieci na temat z zmiany czasu w 1904 (pobieżna lektura klasy Calendar też nie pryniosła rezultatu)

Sławek Sobótka pisze...

Sytuacja miała miejsce w 2006r więc nie pamiętam źródła tej informacji - przekazał nam ją sprawca zamieszania, który zachwycony nowo poznaną klasą Calendar zaczął jej używać namiętnie:)

Ale przy najbliższej okazji zapytam go, bo na pewno pamięta wszelkie szczegóły - nie zdziwiłbym się gdyby śniły mu się po nocach do tej pory hehehe

Jercik pisze...

To był 4 sierpnia 1915: Szczegóły tu.

Sławek Sobótka pisze...

Dzięki za sprostowanie. Widocznie po 5 latach liczby w moim mózgu się rozmyły i 4. sierpnia stał się rokiem 1904.