Przyjrzeć się programom
- Adam Dutkowski,
- 07.09.1998
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