2017-10-06 4 views
-1

Je crée une application qui enregistre les dates sur l'heure universelle. Plus tard, je change les dates en fonction du fuseau horaire spécifié par l'utilisateur.L'heure de l'Est devrait être -4 pas -5? Comment puis-je stocker le décalage de fuseau horaire sur mon application?

Pour enregistrer la date que je fais:

var dateToSaveOnDatabase = DateTime.Now.ToUniversalTime(); 

Si je vais à Google Je vérifie la date de utc être:


enter image description here


Maintenant sur mon application, je laisse l'utilisateur spécifier le fuseau horaire manuellement avec un nombre. Disons que l'utilisateur choisit -5 comme sur mon ordinateur: **


enter image description here


Cela signifie que dans mon code je

var userLocalTime = DateTime.Now.ToUniversalTime().AddHours(-5) 

Si Je fais ça userLocalTime finit par être égal à 20h00! L'heure de l'est devrait être 21h00 et non 20h00: /. Si je google ce qui est l'heure de l'Est, je reçois:

enter image description here

Alors ma question est pourquoi le temps est de -5 égale à si en réalité il est de -4 heures? Je stocke le fuseau horaire de l'utilisateur dans un nombre car l'application est utilisée sur C# et aussi sur Linux. Comment dois-je stocker le fuseau horaire dans mon application?

+4

heure d'été. –

+0

EST = -5, EDT = -4 – axlj

+0

Comment savoir si je suis en heure d'été? Je veux que l'utilisateur spesify le fuseau horaire avec un nombre. Quels paramètres dois-je recueillir de lui? –

Répondre

1

Dans votre application, il est préférable de stocker le code de fuseau horaire, puis de l'ajuster en conséquence. De cette façon, vous prenez en compte l'heure d'été et d'autres décalages étranges (pas tout le monde a un décalage d'une heure, certains sont 30 ou 45 minutes dans quelques cas).

Pour convertir UTC en temps la zone d'un utilisateur en C# avec le code temporel de la zone est facile:

DateTime timeUtc = DateTime.UtcNow; 

TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 

DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);