Kalendarz polski

0

Siema.

Mam do zrobienia kalendarz, który będzie zliczał dni urlopu, jakie pracownik bierze.

Jest może jakaś funkcja/komponent/trick żeby on sam automatycznie wiedział kiedy są święta i dni wolne od pracy(weekendy) - z weekendami to bym samymi se poradził

po prostu chodzi o to żeby jakoś ustawić kalendarz na kalendarz jaki jest w polsce używany

Pozdro

0

Prawie wszystkie święta w naszym kraju mają stałą datę więc z czym problem? Naturalnie z tymi ruchomymi świętami też nie jest źle np. jak obliczać kiedy przypada Wielkanoc masz na Wikipedii. Nie wiem w czym masz problem - szukasz dziury w całym.

0
PcSA napisał(a)

[...]szukasz dziury w całym.

Skad, chce isc na latwizne i wrzucic komponent na forme. Matko, jakie to sie wszystko leniwe zrobilo...

@autor: Tak jak mowi przedmowca, prawie wszystkie daty swiat wystarczy sobie wrzucic do listy/tablicy + te przesuwne (chyba tylko Wielkanoc) i sprawdzac petla, ktore z nich wypadaja w dni robocze.

0

dzajdol czy udało ci sie zrobić taki kalendarz jeśli tak czy możesz podać kod lub podesłać mi robie program i kręcę się w kółko jak to zrobić taki kalendarz.

0

Masz napisane powyzej, wiec nie rozumiem w czym problem?

0

Witam.

Poniżej jest klasa pozwalająca sprawdzić, czy dany dzień jest świętem (działa poprawnie dla lat 1900-2099). Działa również dla świąt ruchomych (Wielkanoc, Boże Ciało).

	public static class HolidayCalculator
	{
		public static bool IsHoliday (this DateTime Day)
		{
			if (Day.DayOfWeek == DayOfWeek.Sunday) return true;
			if (Day.Month == 1 && Day.Day == 1) return true; // Nowy Rok
			if (Day.Month == 5 && Day.Day == 1) return true; // 1 maja
			if (Day.Month == 5 && Day.Day == 3) return true; // 3 maja
			if (Day.Month == 8 && Day.Day == 15) return true; // Wniebowzięcie Najświętszej Marii Panny, Święto Wojska Polskiego
			if (Day.Month == 11 && Day.Day == 1) return true; // Dzień Wszystkich Świętych
			if (Day.Month == 11 && Day.Day == 11) return true; // Dzień Niepodległości 
			if (Day.Month == 12 && Day.Day == 25) return true; // Boże Narodzenie
			if (Day.Month == 12 && Day.Day == 26) return true; // Boże Narodzenie
			int a = Day.Year % 19;
			int b = Day.Year % 4;
			int c = Day.Year % 7;
			int d = (a * 19 + 24) % 30;
			int e = (2 * b + 4 * c + 6 * d + 5) % 7;
			if (d == 29 && e == 6) d -= 7;
			if (d == 28 && e == 6 && a > 10) d -= 7;
			DateTime Easter = new DateTime (Day.Year, 3, 22).AddDays (d + e);
			if (Day.AddDays (-1) == Easter)
				return true; // Wielkanoc (poniedziałek)
			if (Day.AddDays (-60) == Easter)
				return true; // Boże Ciało
			return false;
		}
	}

Jest to klasa implementująca metodę rozszerzającą (od C# 3.0 w górę), dzięki czemu aby później sprawdzić dzień wystarczy np. napisać:

// Zwróci true, bo Boże Ciało
bool CzySwieto = new DateTime (2008, 5, 22).IsHoliday 

Miłego używania i pozdrawiam.

0

Errata - powyżej miało być:

// Zwróci true, bo Boże Ciało
bool CzySwieto = new DateTime (2008, 5, 22).IsHoliday ();
0

Grzegorz Sojka napisał

(działa poprawnie dla lat 1900-2099).

Na pewno nie: po pierwsze nie uwzględnia świąt, które "czekają" na uchwalenie (Trzech Króli), po drugie uważasz, że Polsce od roku 1900 1 i 3 maja były świętami ?

0

Czepiasz się.

Co do lat 1900 - ... miałem na myśli obliczenia dnia Wielkanocy. A co do świąt czekających, to po pierwsze Trzech Króli zostało AFAIK odrzucone przez naszą władzę, a po drugie z takimi założeniami to równie dobrze można powiedzieć, iż metoda nie jest pewna, bo nie wiadomo, czy w 2012 nie będzie końca świata.

0
bogdans napisał(a)

Na pewno nie: po pierwsze nie uwzględnia świąt, które "czekają" na uchwalenie (Trzech Króli), po drugie uważasz, że Polsce od roku 1900 1 i 3 maja były świętami ?
To może się zdziwisz, ale 1. maja był świętem w Polsce nawet przed 1900 rokiem.

Dla malkontentów wersja uwzględniająca zaszłości historyczne z wyjątkiem II Wojny Światowej. Oczywiście koledze bogdans to pewnie nie wystarczy, bo metoda nie antycypuje zmian prawnych w przyszłości.

	public static class HolidayCalculator
	{
		public static bool IsHoliday (this DateTime Day)
		{
			if (Day.DayOfWeek == DayOfWeek.Sunday) return true;
			if (Day.Month == 01 && Day.Day == 01) return true; // Nowy Rok
			if (Day.Month == 01 && Day.Day == 01 && (Day.Year >= 1952 && Day.Year <= 1960)) return true; // Trzech Króli
			if (Day.Month == 05 && Day.Day == 01) return true; // 1 maja
			if (Day.Month == 05 && Day.Day == 03 && (Day.Year >= 1918 && Day.Year <= 1950 || Day.Year >= 1990)) return true; // 3 maja
			if (Day.Month == 07 && Day.Day == 22 && (Day.Year >= 1945 && Day.Year <= 1989)) return true; // Narodowe Święto Odrodzenia Polski
			if (Day.Month == 08 && Day.Day == 15 && (Day.Year <= 1960 || Day.Year >= 1989)) return true; // Wniebowzięcie Najświętszej Marii Panny, Święto Wojska Polskiego (rocznica “cudu nad Wisłą”)
			if (Day.Month == 11 && Day.Day == 01) return true; // Dzień Wszystkich Świętych
			if (Day.Month == 11 && Day.Day == 11 && (Day.Year == 1937 || Day.Year == 1938 || Day.Year >= 1990)) return true; // Dzień Niepodległości 
			if (Day.Month == 12 && Day.Day == 25) return true; // Boże Narodzenie
			if (Day.Month == 12 && Day.Day == 26) return true; // Boże Narodzenie
			int a = Day.Year % 19;
			int b = Day.Year % 4;
			int c = Day.Year % 7;
			int d = (a * 19 + 24) % 30;
			int e = (2 * b + 4 * c + 6 * d + 5) % 7;
			if (d == 29 && e == 6) d -= 7;
			if (d == 28 && e == 6 && a > 10) d -= 7;
			DateTime Easter = new DateTime (Day.Year, 3, 22).AddDays (d + e);
			if (Day.AddDays (-1) == Easter)
				return true; // Wielkanoc (poniedziałek)
			if (Day.AddDays (-60) == Easter)
				return true; // Boże Ciało
			return false;
		}
	}
0

Sam się podłożyłeś pisząc o latach 1900-2099). Ważne jest co napisałeś, a nie co miałeś na myśli (podobno tylko Wielkanoc i zależne od Wielkanocy inne święta kościelne).
Jeśli chodzi o wersję historyczną, to nie mam czasu szukać źródeł żeby ją sprawdzić.

  • z tego że robotnicy manifestowali 1 maja, a kozacy ich pałowali nie wynika, że był to dzień wolny od pracy
  • jestem pewien, że świąt kościelnych w Polsce międzywojennej było więcej
  • mam wrażenie, że nie zawsze z okazji Bożego Narodzenia i Wielkanocy były dwa dni wolne od pracy.
    pozdrawiam
0

Ktos poswieca swoj czas i wiedze dla innych. Wszystkim oczywiscie nie mozna dogodzic i miedzy innymi dlatego nie ma idealnych programowych rozwiazan. Jednak jezeli cos krytykujemy, czyli cos nam nie odpowiada to wypadaloby albo zaprojektowac lepsze rozwiazanie albo przynajmniej wlozyc nieco wysilku w jego zaproponowanie. Odpowiedz typu "nie mam czasu zeby cos sprawdzic" nie nalezy do konstruktywnych.

Wypadaloby tez podejsc z pewnym szacunkiem do wolontariusza-programisty. Krytyka czyjejs pracy zajmuje kilka chwil - sama praca znacznie wiecej.

PS.: Szanuj programiste swego, bo mozesz nie miec zadnego

0

Grzegorzu Sojka, przedstawiłeś podejście od złej strony. Funkcja powinna zwracać ilość świąt w podanym przedziale czasu. Inaczej jesteś skazany na O(n) zamiast O(1) podczas liczenia dni.
No i te multum if'ów ... zrób że sobie tablice jak radzili. Kod się zmniejszy kilkukrotnie i zwiększą się jego możliwości przystosowawcze.

Tylko nie krzycz znowu, że cię ktoś poprawia, chcę ci jedynie podpowiedzieć co można zrobić lepiej (podobnie jak bogdans).

Krytyka czyjejs pracy zajmuje kilka chwil - sama praca znacznie wiecej.
Ciesz się, że przynajmniej na krytykę nas stać. Uwierz to jest na tyle prosta sprawa, że nie chce się tego klepać, nie ma czasu na pierdoły.
A zaklepanie tego przez ciebie może coś cię nauczy. My tylko wskazujemy drogę, to źle ? Mamy w ogóle milczeć ? Pogłaskać po główce i powiedzieć "gratulacje, wrzucamy kod do gotowców i nie wracamy już do problemu" ?

Dobra krytyka jest cenniejsza on gotowego lepszego kodu, gdyż napędza cię do rozwoju, drąży sedno sprawy.

0

@adf88:
Na wstępie chciałbym przeprosić za kilka rzeczy:

  1. Nie przeczytałem regulaminu forum
  2. Nie zapoznałem się z przynajmniej kilkoma postami, a zatem nie wiem jaki punkt odniesienia przyjmują użytkownicy w dyskusjach na tym forum
  3. Piszę bez polskich ogonkowych liter
  4. odpowiadam dosyć późno na starszy watek
  5. nie stosuję właściwego cytowania i moje posty mogą wyglądać niezgrabnie
  6. zamierzam niektóre błędy tutaj chwilowo kontynuować

Zatem cały mój poprzedni post jest z pewnych względów "nie na miejscu". Z drugiej strony otwartość forów internetowych ma swoje plusy i minusy.
Na swoja dodatkową obronę mogę powiedzieć, iż w swoim dotychczasowym życiu liczbę postów (zawodowych emaili nie liczę) na wszelkich forach internetowych mógłbym zapewne policzyć na własnych palcach.

Z mojego punktu widzenia dyskusja od pewnego momentu wygląda tak:

Grzegorz Sojka:
działa poprawnie dla lat 1900-2099
Działa również dla świąt ruchomych (Wielkanoc, Boże Ciało).

bogdans:
Na pewno nie
nie uwzględnia świąt, które "czekają" na uchwalenie

Grzegorz Sojka:
Czepiasz się.
To może się zdziwisz
Dla malkontentów
Oczywiście koledze bogdans to pewnie nie wystarczy

bogdans:
Sam się podłożyłeś
Ważne jest co napisałeś, a nie co miałeś na myśli
nie mam czasu szukać źródeł
z tego że robotnicy manifestowali 1 maja, a kozacy ich pałowali nie wynika

To są elementy dyskusji, które należałoby albo poprawić (np.: uzupełnić luki merytoryczne definicji rozwiązania problemu) albo wyrzucić.
Dlaczego?
Bo dyskusja taka przypomina bitwę na przytyki, a nie dochodzenie do efektywniejszych rozwiązań.
Przy czym wybrałem tylko te elementy, które mogą sprawiać, ze cały konkretny post zawierający te elementy ma wymowę negatywną.
Człowiek czyta nie tylko tekst, ale interpretuje go jednocześnie emocjonalnie.

Odpowiadając na ostatni post:

"My tylko wskazujemy drogę, to źle ? Mamy w ogóle milczeć ? Pogłaskać po główce i powiedzieć "gratulacje, wrzucamy kod do gotowców i nie wracamy już do problemu?"

Na wszystkie pytania odpowiedź brzmi: nie
Ironia tych pytań ma uzasadnienie w moim pierwszym poście i ja to rozumiem.
Co najważniejsze nie czuję żadnej urazy.

"A zaklepanie tego przez ciebie"

Niczego nie zaklepałem. Watek był nadal otwarty. Nikomu nie zabraniam wypowiadania się.

"może coś cię nauczy."

Nie potrzebuje nauki od nikogo i nikogo nie chcę nauczać. Natomiast chętnie wymieniam się wiedzą z ludźmi, którzy na to zasługują.
Od czasu napisania pierwszego posta moja wiedza wzrosła. Każdy jest w stanie dostrzec iż mój pierwszy post tutaj jest zbyt "nauczycielski".

"Ciesz się, że przynajmniej na krytykę nas stać. Uwierz to jest na tyle prosta sprawa, że nie chce się tego klepać, nie ma czasu na pierdoły."

Wierzę. Wiem, że większość metod/rozwiązań jest prostych, ale tylko wtedy kiedy się je zna. Dostrzegłem tutaj iż z historii wątku wynika, że rozmawiały osoby z rożnych środowisk:

Grzegorz Sojka nie był użytkownikiem forum
bogdans był/jest użytkownikiem forum od co najmniej kilku miesięcy

Zatem użytkownik profesjonalnego forum ocenia użytkownika "nowo-przybyłego".
Patrząc przez pryzmat takiego odniesienia można lepiej zrozumieć sens mojej pierwszej wypowiedzi.

Niezależnie od tego jakich slow używam, zawsze znajdzie się ktoś kto zrozumie je inaczej niż ja.

Z mojej strony to w zasadzie wszystko. Dzisiaj nie zamierzam aktywnie korzystać z tego forum. Jeżeli jednak ktoś chciałby podjąć dyskusje to będę do tego wątku zaglądał przez miesiąc jeszcze kilka razy. Jeżeli nie to dziękuję wszystkim za to, że szanują zarówno mój jak i swój czas nie odpowiadając w sposób wyraźnie mnie odpytujący.

Życzę miłej i owocnej pracy
Przechodzień (informatyk)

0

... To są elementy dyskusji, które należałoby albo poprawić (np.: uzupełnić luki merytoryczne definicji rozwiązania problemu) albo wyrzucić.
Dlaczego?
Bo dyskusja taka przypomina bitwę na przytyki, a nie dochodzenie do efektywniejszych rozwiązań.
Ehh, nie chce mi się gadać o gadaniu, powiem szybko, bogdans wymienił same błędy (nawet mówiąc o świętach nieuchwalonych, bo nie można powiedzieć, że ten algorytm będzie poprawny aż do 2099 roku), a że z lekką satyrą to tylko mu dziękować za to że nie jest sztywny.

Zatem użytkownik profesjonalnego forum ocenia użytkownika "nowo-przybyłego".
Nowy, nie nowy nie ma znaczenia. Każdy kod jest oceniany nawet ten publikowany przez wyjadaczy. A nuż coś się znajdzie co można ulepszyć. Chodzi jedynie o rozwój. W tej kwestii nie ma znaczenia czy jesteś pierwszy raz na forum, czy od początku jego istnienia.

0

Wyjaśniając - nie, nie sądzę żeby mój kod był super fantastyczny, ALE do większości zastosowań wystarczy. Gdybym znalazł taki kod wcześniej, to oszczędziłoby mi to trochę czasu. Może mój ktoś znajdzie i sam oszczędzi czas.

Jeśli komuś mało, to proszę sobie ulepszać i dzielić się ulepszeniami w tym wątku. Póki co malkontentów widzę, a kodu nie. BTW: Jest tam multum if-ów, jako, że bawienie się tablicami byłoby wolniejsze, a zysk z nich to byłoby parę linijek.

0

Ja kodu nie piszę, bo uważam że nawet w roku 2009 nie da się napisać programu, który poprawnie rozpozna dni wolne w 2009 roku. Święto może przypaść w sobotę i pracodawca musi dać pracownikom zastępczy dzień wolny - program nie odgadnie daty tego zastępczego dnia wolnego. Zatem każdy program, który wymaga znajomości dni wolnych powinien wygenerować pewną propozycję dni wolnych, a następnie wymusić na użytkownikach programu korektę tego kalendarza, i zapamiętanie go w jakiejś bazie danych. W wielu firmach (np praca kierowców) taki kalendarz dni wolnych zależy od pracownika.

1 użytkowników online, w tym zalogowanych: 0, gości: 1