TimeZone - uložení časového pásma   otázka

Architektura, .NET

Dobrý den,

potřebuji ukládat informaci o časových pásmech (včetně různých jazykových verzí). Mám tedy nějaký datum+čas a potřebuji současně s touto hodnotou uložit informaci o jaké časové pásmo se jedná.

Nedoporučil by mi prosím někdo nějaký vhodný postup?

Jednou z variant by mohlo být použít TimeZoneInfo a ukládat hodnotu Index. Problém je v tom, že Vista a W7 nepodporují v registrech již hodnotu Index.

Předem děkuji

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

Záleží na tom, k čemu přesně má sloužit to uložení časového pásma a kam se má ukládat.

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

Protože se v aplikaci pracuje se záznamy v časových pásmech dle uživatele (zadávané údaje) a dále s dalšími daty, které opět mohou být v různých časových pásmech, jde o to sladit to vše k sobě. Proto má být proveden záznam uživatelských údajů/dat v původním časovém pásmu a k tomu informace o jaké se jedná.

I kdyby se vše převádělo do UTC, stejně by pro následné zobrazení už.dat bylo potřeba vrátit je do původního pásma.

Jinak uživatelská data jsou ukládna do souborů Xml.

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

A je časové pásmo zadáváno explicitně nebo je odvozené od nastavení systému?

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

Časové pásmo je uživatelem vybíráno a to z důvodu, že podle toho co komu vyhovuje zadává časy v různých časových pásmech. Jinak řečeno, může zadávat časy v pásmu -6h a přitom se nacházet (počítač) v časovém pásmu +1h. Má to v apliaci svůj opodstatněný význam.

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

To jde řešit právě DateTimeOffset, který vytvoříte:

var hodnota = new DateTimeOffset(čas, TimeSpan.FromHours(posun_v_hodinách);

Hodnota čas je klasický DateTime a hodnota posun_v_hodinách je číselná hodnota určující pásmo (-14 až +14)

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

Jenže toto patrně neřeší časový posun v souvislosti s letním časem. Jestli to dobře chápu, dojde k posunu času o definový časový úsek.

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

O letním/zimním čase píšete poprvé.

Třída TimeZoneInfo nabízí seznam statických funkcí pro konvertování datumů pro různá pásma. Většinou jde o konverzi klasického času za použití časového pásma na jiné časové pásmo. Obecně platí, že časové pásmo se určuje třídou TimeZone, která přechovává i způsob střídání letního a zimního času a tak konverze provádí automaticky.

Z jakých tříd vycházet už víte, projděte si jejich funkce a najdete co potřebujete,

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

předně děkuji za všechny odpovědi a za váš čas.

Třídy jsem si prošel a vyzkoušel jsem praktickou aplikaci použití vlastnosti Index třídy TimeZoneInformation, nicméně je toto řešení stále problematické a proto jsem se chtěl poradit jestli existuje nějaké spolehlivé řešení jak ukládat informaci o vybraném časovém pásmu.

Takže stále zůstává otázkou jakou hodnotu použít pro uložení informací (do souboru xml) o vybraném časovém pásmu.

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

Mám takový pocit, že DateTimeOffset se bude s údajem pásma serializovat. Pokud chcete použít klasický DateTime, zkontrolujte jeho vlastnost Kind. Podle její nastavení se bude měnit i formát serializace. Zkuste si to.

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

Stále si nejsem jistý, že toto je správné řešení. Uvedu důvody:

DateTimeOffset má tento formát zápisu do Xml:

YYYY-MM-DDThh:mm:ss[.nnnnnnn] [+|-]hh:mm

Pokud budu mít uloženou hodnotu offsetu od UTC znamená, že mám údaj o kolik bylo původní časovém pásmo mimo čas UTC, ale nemám tím definování o které konkrétní časové pásmo se jednalo, protože ve stejném offsetu bude více konkrétních časových pásem.

A nyní je zásadní otázka: Budou mít vždy časová pásma se stejným offsetem i stejný datum přechodu ze Standardního času na Letní? Já si myslím, že tomu tak být na 100% nemusí a tudíž jsem zpět u svého původního problému.

Pro si myslím, že pro přesnou synchornizaci hodnot Datum+Čas v rámci celého roku je třeba znát informaci o konkrétním časovém pásmu (TimeZone).

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

Prozatím se mi zdá stále nejlepší řešení používat třídu TimeZoneInformation a upravit její funkci EnumZones() pro použití na novějších OS (Vista/W7).

Problém nastává s hodnotami Index (které používám pro uchování informace o které časové pásmo se jedná), protože se liší u WinXP a Vista/W7. Znamená to, že není vzájemná kompatibilita uložených hodnot mezi různými OS. Také je díky tomu maličko komplikovanější nastavení defaultní hodnoty (např. na UTC), protože je třeba ji určit v závislosti na OS.

Výhodou tohoto řešení je, že je přesně identifikováno časové pásmo a lze libovolně převádět Datum+čas do jakéhokoliv jiného pásma a to včetně správného nastavení Letního/Standardního času.

Nevýhodou je zmíněná nekompatibilita uložených hodnot mezi OS a dále nesmí být změněn seznam časových pásem v registrech.

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

XML má podle specifikace možnost ukládat datum a čas včetně časového pásma. Framework .NET s tak silnou podporou XML to také umí.

K ukládání datumu a času s časovým pásmem můžete buď použít variantu DateTime, který budete zakládat s parametrem DateTimeKind.UTC, čimž nastavujete i uchování offsetu časového pásma.

Druhou možností (pozor, až od .NET 3.5) je speciální typ DateTimeOffset, který slouží speciálně k uložení datumu, času a časového pásma. Jeho použití je na první pohled jednoduší, pokud již dopředu víte, že časová páma používat budete. Struktura je podobná klasickému DateTime.

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

Ještě doplňuji, že DateTimeOffset byl doplněn i kvůli podpoře stejného typu v SQL Serveru 2008. Snaží se řešit problém s přenosem datumů přes různá časová pásma.

nahlásit spamnahlásit spam 1 / 1 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