2010-06-05 8 views
24

Dans la base de données, je stocke toutes les dates/heures en UTC..NET Décalage du fuseau horaire par nom de fuseau horaire

Je connais le nom de fuseau horaire de l'utilisateur ("US Eastern Standard Time" par exemple).

Afin d'afficher l'heure correcte, je pensais que je devais ajouter le décalage de fuseau horaire de l'utilisateur à la date/heure UTC. Mais comment est-ce que je devrais décalage de fuseau horaire par le nom de fuseau horaire?

Merci!

Répondre

37

Vous pouvez utiliser TimeZoneInfo.FindSystemTimeZoneById pour obtenir l'objet TimeZoneInfo en utilisant l'adaptateur Id, puis TimeZoneInfo.GetUtcOffset de cette:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"); 
TimeSpan offset = tzi.GetUtcOffset(myDateTime); 
+0

Cela a résolu mon problème. Je vous remercie! –

+0

Cela ne semble pas fonctionner pour moi. Actuellement, il est DST dans la zone "E. Australia Standard Time", donc leur heure est GMT + 11. Cependant, quand je cours cela, j'obtiens un résultat de 10 heures. Il doit être 11. Le code est: TimeZoneInfo.FindSystemTimeZoneById ("Heure standard de l'Australie"). GetUtcOffset (Now.ToUniversalTime) .Heures. Qu'est-ce que je fais mal? –

+0

@ ingredient_15939 - Peut-être rien de mal. Avez-vous vérifié que l'ordinateur sur lequel il s'exécute est configuré pour utiliser DST correctement? – Oded

4

Vous pouvez utiliser la méthode GetSystemTimeZones() de la classe TimeZoneInfo pour extraire la liste de tous les fuseaux horaires configurés sur votre serveur et la faire correspondre à celle de votre client. Mais pourquoi avez-vous des fuseaux horaires au format "US Eastern Standard Time"? D'où vient cela?

+0

Grande idée, va essayer maintenant :) Je peuplant une goutte vers le bas avec collection retournée par GetSystemTimeZones() –

+0

Plutôt que de peupler le menu déroulant avec l'identifiant/chaîne de chaque objet 'TimeZone' dans la collection, pourquoi ne pas ajouter les objets réels à la place de 'Item's dans le menu déroulant? Ainsi, lorsque la liste déroulante est modifiée, vous pouvez simplement saisir une référence à l'objet TimeZoneInfo à l'aide de '(TimeZoneInfo) myDropDown.SelectedItem' Vous n'aurez donc pas besoin d'appeler' .FindSystemTimeZoneById' à chaque fois, vous auriez déjà le objet. –

2

Plutôt que de faire une addition manuelle vous devriez profiter de la méthode ConvertTime de TimeZoneInfo qui se chargera de la conversion votre date en fonction du fuseau horaire que vous spécifiez.

var localizedDateTime = TimeZoneInfo.ConvertTime(yourDateTime, localTimeZoneInfo); 
+0

Excellent conseil. –