A programjainkban adódhat, hogy a dátumot, idÅ‘t szeretnénk megjelenÃteni és tárolni. Erre a System névtérben található DateTime tÃpus alkalmas. A DateTime osztály teljes leÃrása a https://msdn.microsoft.com/en-us/library/system.datetime cÃmen található meg.
A DateTime tÃpusokat össze is adhatjuk, illetve kivonhatjuk egymásból, ami egy TimeSpan tÃpust eredményez, ami egy idÅ‘intervallum leÃrására szolgál. A TimeSpan osztály teljes leÃrása a https://docs.microsoft.com/en-us/dotnet/api/system.timespan cÃmen található meg.
A DateTime osztályon keresztül kérdezhetjük le az aktuális időt és dátumot, az alábbi statikus tulajdonságok valamelyikével:
DateTime.Now;
A jelenlegi dátum és idő lekérdezése
DateTime.Today;
A mai dátum lekérdezése
DateTime.UtcNow;
A jelenlegi dátum és idő lekérdezése egyezményes koordinált világidőben.
Az objektum létrehozása után a dátum és idő lekérdezésére az alábbi metódusok és tulajdonságok használhatóak:
DateTime Date;
A jelenlegi dátum és idÅ‘ objektumból készÃt egy olyan dátum és idÅ‘ objektumot, amiben a dátum megegyezik a maival, de az idÅ‘ rész nulla értékű.
int Year;
A jelenlegi dátum és idő objektumból visszaadja az évet.
int Month;
A jelenlegi dátum és idő objektumból visszaadja a hónapot.
int Day;
A jelenlegi dátum és idő objektumból visszaadja a napot.
int DayOfYear;
A jelenlegi dátum és idÅ‘ objektumból kiszámÃtja, hogy az aktuális nap az évnek hanyadik napja.
DayOfWeek DayOfWeek
Visszaadja egy DayOfWeek felsorolásban (enum) a hét aktuális napját.
int Hour;
A jelenlegi dátum és idő objektumból visszaadja az órát.
int Minute;
A jelenlegi dátum és idő objektumból visszaadja a percet.
int Second;
A jelenlegi dátum és idő objektumból visszaadja a másodpercet.
int Millisecond;
A jelenlegi dátum és idő objektumból visszaadja a milliszekundumokat.
A dátum és idÅ‘ formázott megjelenÃtéséhez a keretrendszer tartalmaz pár elÅ‘re definiált dátum és idÅ‘ megjelenési formátumot. Az alábbi táblázat az elÅ‘re definiált formátum jelölÅ‘ket mutatja be:
| JelölÅ‘ | LeÃrás |
|---|---|
| d | Rövid dátum, a hónap számmal |
| D | Hosszú dátum, a hónap neve szövegként |
| t | Rövid idő másodperc nélkül |
| T | Hosszú idÅ‘ másodperc megjelenÃtéssel |
| f | Teljes dátum és idő. Hónap neve szöveggel. |
| F | Teljes dátum és idő. Idő esetén a másodpercet is mutatja. |
| g | Alapértelmezett dátum és idő formátum. Hónap számmal. |
| G | Alapértelmezett dátum és idő formátum. Idő esetén a másodpercet is mutatja. |
| M | Hónap és nap. A hónap szövegesen |
| r | RFC1123 szerinti dátum szöveg |
| Y | Év és hónap. A hónapot szövegesen Ãrja ki. |
Természetesen létrehozhatunk egyedi dátum és idÅ‘ leÃró szövegeket. Erre a célra az alábbi formázó karaktereket használhatjuk:
| JelölÅ‘ | LeÃrás |
|---|---|
| dd | Nap |
| ddd | Három betűs nap rövidÃtés |
| dddd | Az adott nap szövegesen |
| hh | Óra megjelenÃtése két számjegyen, 12 órás formátumban |
| HH | Óra megjelenÃtése két számjegyen, 24 órás formátumban |
| mm | Percek megjelenÃtése |
| MM | Hónap megjelenÃtése |
| MMM | Három betűs hónap rövidÃtés |
| MMMM | Hónap neve szövegesen |
| ss | Másodpercek kijelzése |
| tt | Napszak kijelzése. Délelőtt vagy Délután lehet |
| yy | Év utolsó két számjegye |
| yyyy | Év négy számjegyen |
| zz | Időzóna eltolódás két számjegyen |
Az alábbi példakód a dátum és idő formátum jelölők használatát mutatja be:
using System;
namespace PeldaStringDatumido
{
class Program
{
static void Main(string[] args)
{
var ido = DateTime.Now;
Console.WriteLine("{0:d}", ido);
Console.WriteLine("{0:D}", ido);
Console.WriteLine("{0:t}", ido);
Console.WriteLine("{0:T}", ido);
Console.WriteLine("{0:f}", ido);
Console.WriteLine("{0:F}", ido);
Console.WriteLine("{0:g}", ido);
Console.WriteLine("{0:G}", ido);
Console.WriteLine("{0:M}", ido);
Console.WriteLine("{0:r}", ido);
Console.WriteLine("{0:Y}", ido);
Console.WriteLine("{0:yyyy-mm-dd, dddd tt hh:mm:ss}", ido);
Console.ReadKey();
}
}
}
A program kimenete valami hasonló lesz:
1. 01. 16.
2. január 16., szombat
15:28
15:28:01
1. január 16., szombat 15:28
2. január 16., szombat 15:28:01
3. 01. 16. 15:28
4. 01. 16. 15:28:01
január 16.
Sat, 16 Jan 2016 15:28:01 GMT
1. január
2016-28-16, szombat du. 03:28:01
DateOnly és TimeOnly
A DateTime struktúra a .NET 1.0 óta létezik és abban az esetben, ha dátumot és időt szerenténk tárolni a programunkban, akkor jól is teszi a dolgát. De mi van akkor, ha csak dátumot vagy csak időt szeretnénk tárolni?
Ha csak dátumra van szükségünk, akkor létrehozunk egy DateTime példányt a kÃvánt dátummal úgy, hogy nem töltjük ki az idÅ‘ részt. Ez egészen addig tökéletes, amÃg nem kell megjelenÃtenünk vagy szöveggé konvertálnunk.
var x = new DateTime(2022, 1, 31);
Console.WriteLine(x);
A fenti két sor kiÃratva a következÅ‘ szöveget eredményezi: 2022. 01. 31. 0:00:00
A működés logikus, ha végiggondoljuk, mert az idÅ‘ rész alapértelmezett értékekkel kerül feltöltésre. Ha csak idÅ‘t szeretnénk tárolni, akkor egy picivel komplikáltabb helyzetben vagyunk, mivel a 0. év 1. hónapjának 1. napját kell dátumnak beállÃtanunk vagy valamelyik másik elfogadott, ténylegesen létezÅ‘ dátumot. Viszont kiÃratáskor akkor is meg kell küzdenünk.
És akkor még nem beszéltünk a pazarlásról. A legtöbb adatbáziskezelő megoldás támogat csak idő és csak dátum alapú tárolást is. Azonban ha ezekből a rendszerekből időt vagy dátumot vettünk át, akkor mindig egy DateTime struktúra lett a dolog vége, ami több memóriát foglal, mint csak egy dátum vagy idő tárolása. Mint tudjuk, sok kicsi sokra megy. Ez pedig különösen igaz a dátumokra és időkre, hiszen nincs olyan üzleti alkalmazás, ahol nem kellenének, akár milliós nagyságrendben.
A fentebb emlÃtett okok miatt a .NET 6 bevezeti a DateOnly és TimeOnly struktúrákat, amelyek csak dátum és csak idÅ‘ tárolására alkalmasak.
var d = new DateOnly(2022, 1, 31);
Console.WriteLine(d); //2022.1.31
var t = new TimeOnly(12, 14, 15);
Console.WriteLine(t); //12:14