2011-07-13 5 views
9

J'ai un tas de dates que je garde la trace de mon application. Ils sont tous en temps UTC. Pour une partie de mon application, je veux envoyer un e-mail avec l'un de ces moments, mais édité pour être dans ce fuseau horaire spécifique.C# Datetimes: Conversion pour différents fuseaux horaires

Il n'y a que deux grands domaines que je traiterai, la côte est et au Texas (Dallas et Huston)

Je peux aussi faire une nouvelle datetime lorsque j'envoyer cet e-mail pour obtenir le fuseau horaire de l'Est (DateTime timestamp = DateTime.Now;)

ma question est la suivante:

Si l'utilisateur se trouve dans la région du Texas comment puis-je convertir mon temps de l 'est à ce moment-là (1 heure de moins)?

J'ai essayé quelque chose comme ceci:

  //Convert timestamp to local time 
      TimeSpan ts = TimeZone.CurrentTimeZone.GetUtcOffset(timestamp); 
      timestamp.Add(ts); 

      timestampString = timestamp.ToString(); 

Mais cela ne fonctionne pas. Je sais également que cette ligne n'est pas valide:

timestamp.Hour = timestamp.Hour - 1; 
+1

Vous devez éviter DateTime.Now et utiliser à la place DateTime.UtcNow. DateTime.Now peut vous surprendre un jour, soit avec le mauvais fuseau horaire, soit avec une mauvaise heure d'été. –

Répondre

15

Utilisez la TimeZoneInfo classe pour convertir une heure locale à un moment dans un fuseau horaire de remplacement:

TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime targetTime = TimeZoneInfo.ConvertTime(timeToConvert, est); 
0

Vous pouvez utiliser javascript:

var visitortime = new Date(); 
    vat time = visitortime.getTimezoneOffset()/60; 

Après cela, vous pouvez enregistrer cette valeur à tout contrôle caché qui est « serveur » runat =.

4
var now = DateTime.Now; // Current date/time 
    var utcNow = now.ToUniversalTime(); // Converted utc time 
    var otherTimezone = TimeZoneInfo.FindSystemTimeZoneById("ANY OTHER VALID TIMEZONE"); // Get other timezone 
    var newTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, otherTimezone); // New Timezone 
3

Cela devrait faire l'affaire

DateTime localTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local); 
+0

http://msdn.microsoft.com/fr-fr/library/bb382770(v=vs.110).aspx – Geykel

0

pourquoi pas seulement

TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, "AUS Eastern Standard Time");

et vérifiez obtenir tous les fuseaux horaires disponibles

foreach (TimeZoneInfo tz in TimeZoneInfo.GetSystemTimeZones()) 
{ 
    Console.WriteLine(tz.Id); 
} 
Questions connexes