Kolik je hodin? Stačí se zeptat na DateTime.Now nebo GETDATE(). Jenomže ne tak docela. Často potřebujeme řešit přesnost poskytnutého časového údaje anebo převody časových pásem. Proto jsem napsal knihovnu Altairis.Services.DateProvider, která uvedené problémy řeší.

Příliš velká přesnost

Odpověď na otázku "kolik je hodin" bude s velkou pravděpodobností mnohem přesnější, než jak ji potřebujete. Nechci tady zabíhat do detailů o ukládání datumu a času v .NETu a SQL serveru, jeho různých datových typech a rozdílech mezi precision a accuracy. Nicméně téměř vždy (s výjimkou typu smalldatetime v SQL Serveru) je přesnost vyšší než jedna sekunda. Což zpravidla není třeba a naopak nám to přináší různé obtíže. Tím spíš, že tato hodnota je jiná v .NETu a jiná v databázi (a tam se liší podle toho, jaký datový typ zvolíte).

V praxi často potřebujeme ukládat pouze datum, a pokud datum tak s přesností nejvýše na sekundy, případně dokonce na minuty.

Knihovna Altairis.Services.DateProvider nabízí extension metody TrimToSecond a TrimToMinute, které dokáží přebytečné milisekundy odříznout. Přesnost na sekundy je také výchozím nastavením všech providerů.

Časové zóny

Dalším zdrojem zábavy jsou časové zóny. Tato knihovna si neklade za cíl vám pomoci v případě, že s časovými zónami aktivně pracujete a potřebujete o nich uchovávat údaje. V takovém případě použijte typ DateTimeOffset a hrajte si.

Nicméně často máte server jinde než uživatele (třeba v cloudu) a prosté volání DateTime.Now vám nestačí. Knihovna definuje rozhraní IDateProvider, které má vlastnosti Now a Today, které - stejně jako v případě standardního DateTime - vracejí aktuální čas, potažmo datum.

K dispozici jsou čtyři implementace:

Kompletní dokumentaci najdete na GitHubu.