C# - Dátumkezelés

forráskód letöltése
Mellékelt példában a C# dátum és időkezelési lehetőségeit vizsgáljuk meg alaposabban.
A dátum és időkezeléshez a DateTime nevű struktúrát használhatjuk fel. Az adott dátum és időpont tárolásáról annyit kell tudnunk, hogy az egyetlen számként történik. Ez a szám long típusú, vagyis 64 bites, előjeles szám. Ha ez a szám nulla, akkor az 1. év január 1-jét 0 óra 0 perc 0 másodpercét jelenti. E szám eggyel történő növelése az időpontban 100 nanomásodpercet ér. Ez a szám maximum a 9999. év december 31-ét 23 óra 59 perc 59 másodpercet képes eltárolni. Ezt figyelembe véve tehát 10000 évig nincs gondunk a dátumokra. Ez a szám jelen cikk írásakor, 2001. március 26-án a 631 211 926 990 948 240 értéknél tartott.
Ezt a számot ki is írhatjuk sztringként a következő utasítással egy ListBox-ba:
listBox1.Items.Add("Ticks: "+DateTime.Now.Ticks.ToString());
Amint az látható az aktuális dátumot és időt a DateTime struktúra Now property-én keresztül érhetjük el. Ez a property egy DateTime struktúrában szolgáltatja az értékét. Mivel ezt a struktúra tartalmazza a Ticks nevű property-t is, amely az időpont eltárolt számértékét adja vissza long típusban, így rögtön írhatjuk is utána. A ListBox-ba történő íráshoz még konvertálnunk kell ezt a számot sztringgé a ToString függvény hívásával.
A DateTime struktúra még tartalmazza a következő property-ket:
Year – visszaadja egy dátum év részét, int típusban
listBox1.Items.Add("Year: "+DateTime.Now.Year.ToString());
Month – visszaadja egy dátum hónap részét, int típusban
listBox1.Items.Add("Month: "+DateTime.Now.Month.ToString());
Day – visszaadja egy dátum nap részét, int típusban
listBox1.Items.Add("Day: "+DateTime.Now.Day.ToString());
Hour – visszaadja egy időpont óra részét, int típusban
listBox1.Items.Add("Hour: "+DateTime.Now.Hour.ToString());
Minute – visszaadja egy időpont perc részét, int típusban
listBox1.Items.Add("Minute: "+DateTime.Now.Minute.ToString());
Second – visszaadja egy időpont másodperc részét, int típusban
listBox1.Items.Add("Second: "+DateTime.Now.Second.ToString());
Millisecond – visszaadja egy időpont ezredmásodperc részét, int típusban
listBox1.Items.Add("Millisecond: "+DateTime.Now.Millisecond.ToString());
Egy dátum alapján megtudhatjuk azt is, hogy hány nap telt el az adott évből a megadott dátumig. Ehhez a DayOfYear property-t kell használnunk.
listBox1.Items.Add("DayOfYear: "+DateTime.Now.DayOfYear.ToString());
Hasonlóan megtudhatjuk egy dátumból, hogy az hányadik napot takarja az adott héten. Ehhez a DayOfWeek property-re lesz szükségünk, mely egy számot ad vissza. Nulla esetén vasárnap, egy esetén hétfő, majd így tovább szombatig, amelyhez a hatos szám tartozik.
listBox1.Items.Add("DayOfWeek: "+DateTime.Now.DayOfWeek.ToString());
Lehetőségünk van arra is, hogy a csak a dátumot érjük el egy DateTime struktúrából. Ehhez a Date nevű property-t kell használnunk.
listBox1.Items.Add("Date: "+DateTime.Now.Date.ToString());
Ha csak az időpontra lenne szükségünk, akkor pedig a TimeOfDay property-t kell használnunk.
listBox1.Items.Add("TimeOfDay: "+DateTime.Now.TimeOfDay.ToString());
A DateTime struktúra minimális és maximális értékét is lekérdezhetjük a MinValue, illetve MaxValue mezőkkel.
listBox1.Items.Add("MinValue: "+DateTime.MinValue.ToString());        
listBox1.Items.Add("MaxValue: "+DateTime.MaxValue.ToString());        
listBox1.Items.Add("MinValue Ticks: "+DateTime.MinValue.Ticks.ToString());        
listBox1.Items.Add("MaxValue Ticks: "+DateTime.MaxValue.Ticks.ToString());        
Természetesen arra is van lehetőségünk, hogy a DateTime típusú adatokkal különféle számítási műveleteket is végezzünk. Rendelkezésünkre állnak olyan függvények, melyek Add szóval kezdődnek. Ezek segítségével egy adott értéket adhatunk hozzá egy DateTime típushoz. Így például az AddDays segítségével napokat adhatunk hozzá, vagy vehetünk el egy dátumból, mivel a függvény negatív értéket is elfogad. Ha például a tegnapi dátumra lenne szükségünk, akkor azt az alábbi sorral kiszámíthatjuk:
listBox1.Items.Add("Tegnap: "+DateTime.Now.Date.AddDays(-1).ToString());
További lehetőségeink vannak a dátum és időpont megváltoztatására:
  • AddYears – évek változtatása
  • AddMonths – hónapok változtatása
  • AddDays – napok változtatása
  • AddHours – órák változtatása
  • AddMinutes – percek változtatása
  • AddSeconds – másodpercek változtatása
  • AddMilliseconds – ezredmásodperc változtatása
  • AddTicks – dátum, idő változtatása 100 nanomásodperc egységenként
Természetesen nagyobb intervallumot is megadhatunk ezeknél a függvényeknél, mint ami a függvény egységére vonatkozik. Így például 100 hónappal is növelhetjük az aktuális dátumot:
listBox1.Items.Add("+ 100 hónap: "+DateTime.Now.Date.AddMonths(100).ToString());
Mivel a DateTime struktúra az alapvető operátorokat is felülírja, így arra is van lehetőségünk, hogy két DateTime típusú változót egyszerűen összeadjunk, kivonjunk egymásból, vagy akár összehasonlítsuk őket egymással.
A DateTime struktúra használatával azt is megtudhatjuk, hogy egy adott hónap hány napos. Ehhez a DaysInMonth függvényt kell használnunk. Itt első paraméterként a kérdéses évet, másodikként a hónapot kell megadnunk. Az év megadására csak az esetleges szökőévek miatt van szükség a februári hónap napjai számának meghatározása miatt.
listBox1.Items.Add("Január napjainak száma: "+DateTime.DaysInMonth(2001, 1).ToString());
A DateTime struktúra arra is lehetőséget biztosít, hogy tetszőlegesen formázva írjuk ki a dátumot, vagy az időpontot. Ehhez a Format függvényt használhatjuk, melynél az első sztring típusú paraméterbe kell leírnunk, hogy milyen formázást szeretnénk végrehajtani. Ehhez különféle karaktereket kell használnunk, melyek előírják a Format részére, hogy miként is kell megjeleníteni az adott dátumot, időpontot.
      listBox1.Items.Add("Format Date: "+DateTime.Now.ToString("yyyy. MMMM. dd."));
      listBox1.Items.Add("Format Time: "+DateTime.Now.ToString("T"));
Arra is van lehetőségünk, hogy egy sztringként megadott dátumot a DateTime értelmezzen és dátummá, idővé alakítsa azt. A mellékelt példában a textBox-ba írt sztringet alakíttatjuk át DateTime típussá, majd vissza sztringgé is ezt egy Label-on megjelenítjük. Átalakításhoz a Parse függvényt használhatjuk.
   protected void button1_Click (object sender, System.EventArgs e)
    {
        label1.Text = DateTime.Parse(textBox1.Text).ToString();       
    }