Varför lagrar du inte UTC i DB i första hand? I de flesta fall DateTime
bör lagras i UTC, eftersom det vanligtvis hänvisar till en tidpunkt. Detta är sant för allt som hänvisar till tid i fysisk mening, och allt som förutsätter att tiden är monoton, ökande och unik, varav inget är sant för de flesta lokala tider.
Ibland är det meningsfullt att använda lokala tider:anta att en buss går varje dag klockan 9.00. Det betyder att det går 24 timmar mellan två på varandra följande händelser. Men om tidszonen har en sommartid kommer det att vara ett 23- respektive 25-timmarsintervall en gång om året.
Men om du behöver bråka den här typen av data, en enkel DateTime
gör inte susen; Sommartidsregler kan ändras, tidszoner kan ändras etc. I C# är de sommartidsregler som kommer att tillämpas de som är för närvarande giltigt även om datumet är "historiskt". Datumräkning med historiska datum kan alltså orsaka förödelse. Om du verkligen behöver klara av detta bör du åtminstone lagra vilken tidszon som tiden är i (inte bara förskjutningen, eller till och med bara en isLocal
flagga).
Att lagra textinformation i databasen som kan lagras binärt verkar inte särskilt elegant för mig, inte heller att ändra värdet i något mellanlager. Den förra är ineffektiv och lider av de tidigare nämnda särdragen med lokal tid, den senare har bara det andra problemet.
BTW, för att åstadkomma det senare kan du dekorera fastigheten med [BsonDateTimeOptions(Kind=DateTimeKind.Local)]
, som kommer att göra konverteringen åt dig, men lider av samma problem, naturligtvis.