Proč v první řadě neukládáš UTC do DB? Ve většině případů DateTime
by měl být uložen v UTC, protože se obvykle vztahuje k určitému časovému bodu. To platí pro cokoli, co se týká času ve fyzickém smyslu, a cokoli, co předpokládá, že čas je monotónní, rostoucí a jedinečný, z čehož nic neplatí pro většinu místních časů.
Občas má použití místního času smysl:předpokládejme, že autobus odjíždí každý den v 9:00. To znamená, že mezi dvěma po sobě jdoucími událostmi uplyne 24 hodin. Pokud však časové pásmo obsahuje DST, bude to 23h, respektive 25h interval jednou ročně.
Pokud však potřebujete tento druh dat pohádat, stačí jednoduchý DateTime
nedělá trik; Pravidla DST se mohou změnit, časová pásma se mohou změnit atd. V C# budou použita pravidla DST, která jsou aktuálně platné, i když je datum „historické“. Aritmetika dat s historickými daty tak může způsobit zmatek. Pokud se s tím opravdu potřebujete vyrovnat, měli byste uložit alespoň které časové pásmo, ve kterém je čas (nejen posun, nebo dokonce jen isLocal
vlajka).
Ukládání textových informací do databáze, které lze uložit binárně mi nepřijde moc elegantní, stejně tak změna hodnoty v nějaké střední vrstvě. První z nich je neefektivní a trpí dříve zmíněnými zvláštnostmi místního času, ten má pouze 2. problém.
BTW, abyste dosáhli toho druhého, můžete nemovitost ozdobit pomocí [BsonDateTimeOptions(Kind=DateTimeKind.Local)]
, který provede konverzi za vás, ale trpí samozřejmě stejnými problémy.