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
2025.12.09. @ 11:34
„2016-28-16, szombat du. 03:28:01”
Mi a furcsa ebben a dátumban? 🙂