StartAlgorytmyPrzetwarzanie datWyznaczanie dnia tygodnia
Baza Wiedzy
Wersja offline serwisu przeznaczona na urządzenia z systemem Android.

Darowizny
darowiznaWspomóż rozwój serwisu


Nagłówki RSS
Kanał artykuły
Kanał implementacje
Kanał komentarze
Kanał forum


Bookmarki









Sonda
Implementacji w jakim języku programowania poszukujesz?
 
Wyznaczanie dnia tygodnia
Ocena użytkowników:+++-- / 8
SłabyŚwietny 
Wpisany przez Tomasz Lubiński
niedziela, 02 marca 2008 20:12
Przedstawiony tutaj algorytm pozwala na szybkie obliczenie dnia tygodnia dla podanej daty dzień-miesiąc-rok. Wszystkie przedstawione operacje dzielenia są operacjami dzielenia całkowitego - tzn. odrzucającymi resztę. Czyli 5/2 = 2.
Na początku obliczymy dzień tygodnia dla pierwszego stycznia podanego roku. 0 oznacza poniedziałek, 1 wtorek, ... 6 niedzielę.
  • YY = (rok-1) mod 100
  • C = (rok-1) - YY
  • G = YY + YY/4
  • dzień tygodnia dla 1 stycznia = (((((C / 100) mod 4) * 5) + G) mod 7)


Teraz zdefiniujemy pomocniczą tabelę określającą ile dni roku minęło dla podanego miesiąca. Tabela zdefiniowana jest dla roku nieprzestępnego:

Miesiącliczba dni
styczeń0
luty31
marzec59
kwiecień90
maj120
czerwiec151
lipiec181
sierpień212
wrzesień243
październik273
listopad304
grudzień334


Następnie wyznaczymy dzień roku:
  • dzień roku = liczba dni, które minęły dla podanego miesiąca odczytane z tabeli powyżej + dzień miesiąca
  • Teraz jeszcze należy sprawdzić czy należy dodać jeden dzień w związku z latami przestępnymi. A więc dzień roku należy zwiększyć o 1 jeżeli podany miesiąc jest po lutym oraz podany rok jest przestępny


Mamy już teraz wszystkie niezbędne dane do wyznaczenia dnia tygodnia. Do obliczonego dnia tygodnia dla 1 stycznia dodajemy wyznaczony dzień roku pomniejszony o 1 i dzielimy całość modulo 7. Wynik to dzień tygodnia dla podanej daty, 0 oznacza poniedziałek, 1 wtorek, ... 6 niedzielę.

dzień tygodnia = (dzień tygodnia dla 1 stycznia + dzień roku - 1) mod 7


Przykład:
Wyznaczymy dzień tygodnia dla: 15-2-2008.
A więc najpierw obliczymy dzień tygodnia dla 1 stycznia.
YY = (rok-1) mod 100 = (2008-1) mod 100 = 2007 mod 100 = 7.
C = (rok-1) - YY = (2008-1) - 7 = 2007 - 7 = 2000.
G = YY + YY/4 = 7 + 7/4 = 7 + 1 = 8.
dzień tygodnia dla 1 stycznia = (((((C / 100) mod 4) * 5) + G) mod 7) = (((((2000 / 100) mod 4) * 5) + 8) mod 7) = ((((20 mod 4) * 5) + 8) mod 7) = (((0 * 5) + 8) mod 7) = ((0 + 8) mod 7) = 8 mod 7 = 1.
Zatem 1 stycznia 2008 roku to wtorek.
Teraz obliczymy, którym dniem roku 2008 jest dzień 15-2.
dzień roku = 31 + 15 = 46.
Podany rok jest rokiem przestępnym, ale podany miesiąc nie jest późniejszy niż luty a więc nie dodajmy 1 do dnia roku.
A więc ostatecznie:
dzień tygodnia = (dzień tygodnia dla 1 stycznia + dzień roku - 1) mod 7 = (1 + 46 - 1) mod 7 = 46 mod 7 = 4.
A więc 15-2-2008 to piątek.


Autor Język programowania Komentarz Otwórz Pobierz Ocena
Tomasz Lubiński C# MS Visual Studio .net
Implementacja w C#
Implementacja w C#
++++- / 2
Tomasz Lubiński C/C++
Implementacja w C/C++
Implementacja w C/C++
++++- / 10
Michał Burchardt C/C++ C++
Implementacja w C/C++
Implementacja w C/C++
++++- / 2
Tomasz Lubiński Delphi/Pascal
Implementacja w Delphi/Pascal
Implementacja w Delphi/Pascal
+++-- / 3
Tomasz Lubiński Java
Implementacja w Java
Implementacja w Java
++++- / 1
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie



Poprawiony: sobota, 29 maja 2010 16:44

Komentarze

 
photo
0 # ciekawy 2011-09-10 15:52
chciałem zapytać czy ten algorytm jest jakoś nazwany, czy to algorytm wymyślony przez autora artykułu?
Odpowiedz | Odpowiedz z cytatem | Cytować
 
 
photo
0 # Tomasz Lubiński 2011-09-12 07:57
Nie wydaje mi się, żeby miał on jakąś nazwę. Bazuje on po prostu na wyliczeniu:
Dzień 1 stycznia roku 1 + liczba lat od roku 1 * liczba dni w roku + liczba lat przestępnych od roku 1 do roku poprzedzający zadany rok + liczba dni w roku bieżącym i to wszystko modulo 7. Tak więc jakaś wyższa matematyka to to nie jest
Odpowiedz | Odpowiedz z cytatem | Cytować
 

Dodaj komentarz

Kod antysapmowy
Odśwież