2013-05-20 21 views
5

jestem przeciwko emisji przechowującej datetimes jak UTC i mylić dlaczego to nie daje ten sam efekt przy zmianie stref czasowych:Konwersja czasu lokalnego UTC

var dt = DateTime.Parse("1/1/2013"); 
MessageBox.Show(TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local).ToString()); 

jestem ręczne przełączenie moją lokalną strefę czasową na maszyna między wschodnią a środkową.

Wydajności centralne 1/1/2013 6:00:00 AM i wschodnie zbiory 1/1/2013 5:00:00 AM. Czego tu mi brakuje? Powinny być takie same bez względu na strefę czasową, prawda?

Dziękuję bardzo z góry!

+4

Więc biorą ten sam czas początkowy, kojarząc go do strefy czasu, przekształcając go UTC, a uzyskanie różnych czasów UTC? Brzmi, jakby to działało. – cadrell0

+0

Myślę, że musisz przeczytać ten wpis na blogu Jona Skeeta, aby w pełni zrozumieć problemy z UTC/lokalnymi datetimes: http://noda-time.blogspot.co.uk/2011/08/what-wrong-with-datetime-anyway .html –

+0

Nie rozumiem, dlaczego chcesz przekonwertować na UTC. A może zacząć od UTC? Występuje przeciążenie 'DateTime.Parse', które pozwala ci określić' Kind'. – CodesInChaos

Odpowiedz

8

myślę, czego brakuje to, że DateTime zwrócony przez wyciągu DateTime.Parse() nie pochodzi ze strefy czasowej. To tylko data i godzina, które mogą być w dowolnej strefie czasowej. Kiedy zadzwonisz pod numer TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local), mówisz mu, w której strefie czasowej się znajduje. Jeśli zaczniesz w Centrali, otrzymasz jedną odpowiedź, natomiast jeśli zaczniesz od Wschodu, otrzymasz odpowiedź, która jest godzinę wcześniej, UTC. Rzeczywiście, to właśnie pokazuje twój kod.

+0

Więc jeśli uruchomię DateTime.Now.ToUniversalTime() na Central to tak samo, jak gdybym działał na Wschodzie. Jak utworzyć obiekt datetime, który po przekonwertowaniu na uniwersalny, jest taki sam niezależnie od strefy czasowej? –

+0

@ user1174729 - kiedy mówisz "teraz", mówisz o chwili. Jeśli powiesz "teraz" o północy we własnej strefie czasowej, nie będzie drugiej nocy w nocy. Jeśli chcesz zbudować datetime, która jest taka sama, niezależnie od strefy czasowej, musisz ją utworzyć w UTC. Istnieje konstruktor, który może przekazać 'DateTimeKind.Utc'. –

+0

Tak, powiedział Matt. Sztuką jest zawsze pracować z DateTimes, które są w UTC, a następnie przekonwertować je do strefy czasowej użytkownika podczas wyświetlania ich. –

3

Jest .ToUtc() metoda DateTime klasy

+0

Ten sam wynik dla: MessageBox.Show (dt.ToUniversalTime(). ToString()); –

+0

To prawda. Btw, w tym samym czasie dla CST i EST istotnie różnią się o godzinę w UTC –

1

To Midnight

var dt = DateTime.Parse("1/1/2013"); 

północy w wschodnia i centralna nie jest taki sam czas absolutny.
To jest cały cel stref czasowych.

+0

Tak, to jest właściwa odpowiedź. Północ w jednej strefie czasowej to 5UTC, a północ w drugiej strefie to 6UTC. –

0

Można użyć NodaTime:

static string LocalTimeToUTC(string timeZone, string localDateTime) 
{ 
    var pattern = LocalDateTimePattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss"); 
    LocalDateTime ldt = pattern.Parse(localDateTime).Value; 
    ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]); 
    Instant instant = zdt.ToInstant(); 
    ZonedDateTime utc = instant.InUtc(); 
    string output = utc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture); 

    return output; 
} 
Powiązane problemy