Jak brakująca stała przesunął wynik w grudniu
Celem ćwiczenia było napisanie funkcji, która na podstawie daty w formacie rok–miesiąc–dzień wyznacza dzień tygodnia. Datę zapisywałem zgodnie z formatem RFC 3339, a do obliczeń wykorzystałem wzór Zellera. Implementację przygotowałem w C#.
Na początku funkcja działała poprawnie dla większości sprawdzanych dat. Dwa testy zwracały jednak inny wynik, niż oczekiwałem. Zauważyłem, że oba dotyczyły dat grudniowych. To zawęziło poszukiwania: ponownie sprawdziłem implementację wzoru i odkryłem, że pominąłem stałą „−2” w jednym z jego składników.
Po poprawieniu wzoru wszystkie testy przechodziły.
return DayOfWeek[((26 * month - 2) / 10 + day + year + year / 4 + cent / 4 + 5 * cent) % 7]; Ta pomyłka przypomniała mi, jak ważne są testy obejmujące różne miesiące i przypadki brzegowe. Pokazała mi też, że gdy wynik jest nieoczekiwany, warto wrócić do założeń i dokładnie porównać implementację z użytym algorytmem.
Źródła:
https://swistak.codes/post/okreslanie-dnia-tygodnia-dla-dowolnej-daty/
https://www.rfc-editor.org/info/rfc3339/#appendix-B
