C# - GregorianCalendar osztály használata

forráskód letöltése
A Gergely naptár sajátosságait kihasználandó készült a GregorianCalendar osztály. E cikkünkben ennek lehetőségeit kutatjuk.
A Gergely naptár időpontja két korszakra osztható, így az lehet Krisztus előtti és utáni. Ez előbbi kódja nulla, míg a másodiké egy. Az ADEra mezőből kiolvashatjuk az aktuális korszak kódját, melynek értéke egy lesz.
      label1.Text = GregorianCalendar.ADEra.ToString(); 
A CalendarType property-n keresztül lekérdezhetjük a naptár típusát.
      label6.Text = FCalendar.CalendarType.ToString();
Ez a következők egyike lehet: Arabic, Localized, MiddleEastFrench, TransliteratedEnglish, TransliteratedFrench, USEnglish. Ezek közül egyet választva hozhatunk létre egy adott típusú naptárat a GregorianCalendar osztály konstruktorának átadva.
Egy dátumot és időpontot, vagy egy DateTime típusú adatot is előállíthatunk a GregorianCalendar-t használva. Ehhez annak ToDateTime függvényét kell használnunk, ahol a megadandó paraméterek sorrendben a következők: év, hónap, nap, óra, perc, másodperc, ezredmásodperc, korszak, mely nulla, vagy egy lehet.
      label8.Text = FCalendar.ToDateTime(2001, 9, 4, 8, 0, 0, 0, GregorianCalendar.CurrentEra).ToString();
Rendelkezhetünk arról is, hogy ha egy évszámot két számjeggyel adunk meg, akkor az melyik évet is jelentse. Ezt a TwoDigitYearMax property-ben tehetjük meg, melynek alapértéke 2029. Ekkor, ha évszámnak azt adjuk meg, hogy 50, akkor abból 1950 lesz, míg ha azt adjuk meg, hogy 20, akkor abból 2020 lesz.
Ennek figyelembevételével dolgozik a ToFourDigitYear függvény, mely két számjeggyel megadott évszámot alakít négyjegyűre.
      FCalendar.TwoDigitYearMax = Int32.Parse(textBox1.Text);                      
      label2.Text = FCalendar.ToFourDigitYear(Int32.Parse(textBox2.Text)).ToString();
Egy dátum és időpont, vagyis egy DateTime típusú változó értékének befolyásolására hozták létre az Add kezdetű függvényeket. Mindegyiknek meg kell adni első paraméterként egy DateTime típust, melynek értékén változtatni szeretnénk és egy növekményt, hogy az mennyivel változzon. Visszatérési értékként szintén DateTime típust kapunk, de most már az új értékkel.
  • AddYears – adott számú évet ad a dátumhoz
  • AddMonths – adott számú hónapot ad a dátumhoz
  • AddWeeks – adott számú hetet ad a dátumhoz
  • AddDays – adott számú napot ad a dátumhoz
  • AddHours – adott számú órát ad az időponthoz
  • AddMinutes – adott számú percet ad az időponthoz
  • AddSeconds – adott számú másodpercet ad az időponthoz
Ne felejtsük el, hogy a második paraméter integer típusú, tehát negatív érték is megadható. Ezt felhasználva nem csak növelni tudjuk az adott időpontot, hanem csökkenteni is.
Ha tudnunk kell egy dátum alapján, hogy az hányadik nap az adott évben, akkor ezt a GetDayOfYear függvénnyel meghatározhatjuk.
      label16.Text = FCalendar.GetDayOfYear(DateTime.Parse(textBox3.Text)).ToString();
Ehhez hasonlóan megtudhatjuk, hogy egy adott dátumban hányadik nap van megadva az adott hónapban a GetDayOfMonth függvénnyel.
      label17.Text = FCalendar.GetDayOfMonth(DateTime.Parse(textBox4.Text)).ToString();
Egy dátum alapján megtudhatjuk azt is, hogy melyik napnál tartunk a héten a GetDayOfWeek függvényt használva.
      label18.Text = FCalendar.GetDayOfWeek(DateTime.Parse(textBox5.Text)).ToString();
Megadva egy évszámot visszakapjuk, hogy hány nap van abban az évben a GetDaysInYear függvénytől.
      label19.Text = FCalendar.GetDaysInYear(Int32.Parse(textBox6.Text)).ToString();
Megadva egy évszámot és egy hónapot visszakapjuk, hogy hány nap van abban a hónapban a GetDaysInMonth függvénytől.
      label20.Text = FCalendar.GetDaysInMonth(Int32.Parse(textBox8.Text), Int32.Parse(textBox7.Text)).ToString();
Ha tudnunk kellene egy dátum alapján, hogy az hányadik hét az adott évben, akkor ehhez használhatjuk a GetWeekOfYear függvényt. Ennél a dátumon kívül meg kell adnunk még egy hét kezelési szabályt is, mely a CalendarWeekRule felsorolt típus elemei közül kell, hogy kikerüljön. Erre azért van szükség, mert általában az újév első napja nem esik egybe a hét első napjával. Így felmerül a kérdés, hogy ha mondjuk január 1. szerdai nap, akkor az már az első hét, vagy még a múlt év utolsó hete? Hogy ezt a kérdést miként kezelje a függvény azt az alábbi módokban határozhatjuk meg.
  • FirstDay – ez esetben az első hét akkor indul, amikor az év első napja van. Ez alapján a 2001. 12. 31. hétfői nap még az 53. hét, de a 2002. 01. 01. keddi nap már az első hét.
  • FirstFourDayWeek – ez esetben az első hét akkor indul, ha a hét első négy vagy több napja erre esik. Ez alapján a 2001. 12. 31. hétfői nap még az 53. hét és a 2002. 01. 01. keddi nap is szintén az. Az első hét csak 2002. 01. 07-én kezdődik hétfői nappal.
  • FirstFullWeek – egy hét, mint egység, úgy lesz figyelembe véve, hogy az egy teljes hét legyen. Ez alapján a 2001. 12. 31. hétfői nap még az 53. hét és a 2002. 01. 01. keddi nap is szintén az és az első hét csak 2002. 01. 07-én kezdődik hétfői nappal.
      label21.Text = FCalendar.GetWeekOfYear(DateTime.Parse(textBox9.Text), (CalendarWeekRule)listBox1.SelectedIndex, DayOfWeek.Monday).ToString();
Egy dátum alapján megállapíthatjuk, hogy az szökőév vagy sem. Ehhez az IsLeapYear függvényt kell meghívni az adott dátummal és egy logikai értéket kapunk vissza.
      label22.Text = FCalendar.IsLeapYear(Int32.Parse(textBox10.Text), GregorianCalendar.CurrentEra).ToString();      
Ehhez hasonlóan hívhatjuk meg az IsLeapMonth függvényt, mely egy hónapról lenne hivatott eldönteni ugyanezt a kérdést, de a GregorianCalendar-ban itt mindig hamis értéket kapunk vissza. Ha a GregorianCalendar-ból származtatunk új osztályt, ott felülírhatjuk az IsLeapMonth működését. Paraméterként itt egy évszámot és a hónap számát kell megadni.
      label23.Text = FCalendar.IsLeapMonth(Int32.Parse(textBox11.Text), Int32.Parse(textBox12.Text), GregorianCalendar.CurrentEra).ToString();      
Egy napról is eldönthetjük, hogy az a szökőév napja-e vagy sem. Ehhez az IsLeapDay függvényt kell meghívni három paraméterrel: év, hónap, nap. A logikai visszatérési érték alapján dönthetjük el, hogy a megadott nap az szökőév plusz napja vagy sem.
      label24.Text = FCalendar.IsLeapDay(Int32.Parse(textBox13.Text), Int32.Parse(textBox14.Text), Int32.Parse(textBox15.Text), GregorianCalendar.CurrentEra).ToString();      
Egy DateTime típust részeire bonthatunk a következő függvényekkel, melyek egy-egy DateTime típust várnak paraméterként és a kért értéket adják integer típusban vissza.
  • GetYear – év
  • GetMonth – hónap
  • GetDay – nap
  • GetHour – óra
  • GetMinute – perc
  • GetSecond – másodperc
  • GetMillisecond - ezredmásodperc