Porovnávání datumů   zodpovězená otázka

C#

Dobrý den, rád bych se poradil jak přesně funguje porovnávání datumů.

Jde mi o to, jestli když použiji DateTime.Compare se ve skutečnosti porovnává údaj datumu nebo double vyjádření datumu.

Ptám se proto, že s porovnáváním hodnot double (z datumů) mám problém kvůli chybám v přesnosti čísel.

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Porovnává se hodnota Ticks (64-bitové celé číslo) což je to nejpřesnější u DateTime.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Vlastnost Ticks je vlastně podobným vyjádřením jako UNIX date (počet sekund od 1.1.1970). Také se jedná o velmi velké číslo, jen se jeho základ a přesnost je odlišná.

Pro porovnávání datumů určitým způsobem (chcete vědět, jestli je pravda, že je něco větší, menší... nejčastěji používané v logických podmínkách) doporučuji použít klasických číselných operátorů větší/menší než (nebo rovno) a (ne)rovná se: <, >, <=, >=, <>, =.

Pro porovnávání datumů neurčitým způsobem (chcete vědět jaký je stav dvou hodnot a nejde vám o to, co je pravda) je opravdu nejužitečnější DateTime.Compare.

Obě metody porovnávají vlastnost Ticks jako číslo. Na vlastnosti Ticks se totiž projeví změna každé vlastnosti objektu typu DateTime (jde o jakousi serializaci celého objektu do jednoho čísla).

Obě metody jsou de facto zaměnitelné a dají se využít všude... Je jen na vás, co využijete.

P.S. Proč si nepřidělávat práci, můžeme měřit velikost TimeSpan.Ticks, který nám vyjde z A.Subtract(B) - A je první porovnávaná hodnota, B je druhá. Tohle taky jde, ale pravděpodobně to bude pomalejší. No, používejte radši jednu z těch prvních dvou :)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

děkuji za informaci.

Já konkrétně pracuji s hodnotou DateTime a hodnotou Double (která je v podstatě OLE aut.date). Jedná se o zdrojová data. Abych tyto hodnoty mohl porovnávat nabízela se varianta převést datum také do double a tyto hodnoty porovnat. Zádrhel nastává pokud se provádí mezitím třeba nějaké odčítání/přičítání času. Nenastane shoda stejných datumů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V tom případě můžete převést Double na DateTime metodou DateTime.FromOADate a porovnat obě data na úrovni struktury DateTime....

double mojeOAD = ...;
DateTime jineDatum = ...;
DateTime OADprevedeno = DateTime.FromOADate(mojeOAD);

DateTime.Compare(jineDatum, OADprevedeno);
// nebo...
if(jineDatum > OADprevedeno) {...}

Pro zajímavost, existuje obousměrný převod mezi DateTime a OLEaut.date:

- DateTime.FromOADate

- DateTime.ToOADate

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jj, to je jasné.

Jde o to v jakých hodnotách pracovat, když například je potřeba zjišťovat časové rozdíly mezi dvěma datumy nebo je třeba přičítat určtý časový úsek, který je původně vyjádřen jako string, a k tomu pak je přidáno i to porovnávání.

Používat double hodnoty mě přišlo jako vhodné řešení (obzvláště když mám velké množství hodnot primárně v double), ale je zde zádrhel s přesností. Tedy konkrétně ne s přesností na nějaký malý úsek (běžně stačí přesnost na vteřinu), ale s tím že pokud použiji například zmíněné odečtení určitého časového úseku, tak výsledná hodnota v double nemusí být přesně shodná jako kdybych vzal výsledek DateTime převedený do double (tedy zde je to zmíněné porovnávání).

Příklad:

20.7.2010 10:00.00 - 00:15.00 (ale počítáno v hodnotách double) nemusí být přesně rovno 20.7.2010 9.45:00 opět ve vyjádření pomocí double.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ještě doplním, že jde také i o rychlost protože se jedná o poměrně dlouhý cyklus opakování (řádově statisíce až mil.).

Je možné, že by práce s Ticks byla znatelně pomalejší než s double. Tedy mám konkrétně namysli převody pomocí datumČas.FromOADate() a datumČas.Ticks?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback