Przyjrzeć się programom

Dopóki programiści nie przyjrzą się dokładnie kodowi własnoręcznie napisanych programów, dopóty trudno będzie im uwierzyć w problem roku 2000.

Dopóki programiści nie przyjrzą się dokładnie kodowi własnoręcznie napisanych programów, dopóty trudno będzie im uwierzyć w problem roku 2000.

"Mamy daty 6-cyfrowe, ale tylko współczesne, więc wiadomo, o który wiek chodzi" lub też "W naszym systemie wszystkie daty są 8-cyfrowe, więc nie będziemy mieć problemów" - to opinie, które wciąż można usłyszeć od niektórych informatyków i to na kilkanaście miesięcy przed początkiem roku 2000.

Przyjrzyjmy się więc datom w aplikacjach i zastanówmy się, jak są używane. Dla uproszczenia przyjmijmy, że daty mają format gregoriański, a rok 2000 potraktujmy jak początek nowego wieku (choć dopiero 1 stycznia 2001 r. będzie początkiem nowego wieku i tysiąclecia).

Zastanówmy się najpierw, czy nie będziemy mieli problemów, które niesie ze sobą reprezentacja 6-cyfrowa (rok zapisywany za pomocą dwóch cyfr):

Niejednoznaczna reprezentacja daty

Nie wiadomo czy data dotyczy obecnego, czy następnego wieku. Ten problem wymienia się najczęściej jako ilustrację zagrożeń roku 2000.

Niejednoznaczna interpretacja daty

Użytkownik, który widząc dzisiaj 02 08 98 bez trudu odgadnie format tej daty, może mieć kłopoty interpretując widoczny na ekranie lub wydruku zapis:

Nieprawidłowe uporządkowanie dat

Jeśli data jest elementem narzucającym pewien porządek w zbiorze danych, np. jest rosnącym kluczem sortowania, to porządek ten zostanie zakłócony wraz z nadejściem roku 2000. Nowe dane powędrują na początek, a nie na koniec zbioru. Podczas przetwarzania może dojść do sytuacji, że nie obejmie ono najnowszych danych bądź zostanie wykonane ponownie dla danych uprzednio przetworzonych.

Nieprawidłowy wynik operacji porównania dat

Problem jest podobny do poprzedniego, tyle że występuje bezpośrednio w programach. Gdy mamy do czynienia z przełomem wieków, wynik porównania wartości dwóch pól zawierających daty będzie zupełnie inny niż oczekiwany. 99 12 30 > 01 12 30, podczas gdy

1999 12 30 < 2001 12 30

Nieprawidłowy wynik operacji arytmetycznych na datach

Klasyczny przykład to obliczanie wieku osoby na podstawie daty bieżącej i urodzenia. Wynik odejmowania będzie ujemny, a jego wartość (nawet gdy program ignoruje znak) - błędna. 98 + 4 = 102, choć powinno być 1998 + 4 = 2002

02 - 98 = -96, choć powinno być 2002 - 1998 = 4

Nieprawidłowe użycie stałych do określania zakresów i ważności dat

Jeśli programista zakładał, że aplikacja nie przetrwa roku 2000, to w jego programach możemy natknąć się często na następujące konstrukcje: IF rr = 00

THEN rok nie zdefiniowany

lub

IF rrmmdd > 999999

THEN koniec przetwarzania

lub

IF rr >= 80 AND rr <= 99

THEN kontynuuj

ELSE niewłaściwy rok