2011-07-13 11 views
9

Mam kilka dat, które śledzę dla mojej aplikacji. Wszystkie są w czasie UTC. W przypadku części mojej aplikacji chcę wysłać wiadomość e-mail z jednym z tych terminów, ale edytuję ją w tej określonej strefie czasowej.C# Datetimes: Konwersja dla różnych stref czasowych

Istnieją tylko dwa główne obszary, które będę czynienia, wschodnie wybrzeże i Texas (Dallas i Huston)

Mogę też zrobić nowy datetime kiedy wysłać tego e-maila, aby uzyskać strefę czasową wschodnią (DateTime timestamp = DateTime.Now;)

Moje pytanie jest takie:

Jeżeli użytkownik znajduje się w obszarze texas jaki sposób można przekonwertować mój czas od wschodniej do tego czasu (1 godzina mniej)?

Próbowałem coś takiego:

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

      timestampString = timestamp.ToString(); 

Ale to nie działa. Wiem też, że ta linia jest nieprawidłowa:

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

Należy unikać DateTime.Now i zamiast używać DateTime.UtcNow. DateTime.Now może Cię zaskoczyć pewnego dnia, z niewłaściwą strefą czasową lub złą oszczędnością czasu letniego. –

Odpowiedz

15

Użyj TimeZoneInfo Class przekonwertować czasu lokalnego na pewien czas w alternatywnym Strefa czasowa:

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

Można użyć javascript:

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

po tym można zapisać tę wartość do każdej ukrytej kontroli, która jest runat = "server".

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

To powinno załatwić sprawę

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

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

0

dlaczego nie tylko

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

i sprawdzić uzyskać wszystkie dostępne strefy czasowe

foreach (TimeZoneInfo tz in TimeZoneInfo.GetSystemTimeZones()) 
{ 
    Console.WriteLine(tz.Id); 
} 
Powiązane problemy