2012-04-20 19 views
9

Jak przychodzą następujący kod (w C#) zwraca false:DateTime.Ticks, DateTime.Equals i stref czasowych

DateTime d = DateTime.Now; 
d.Ticks == d.ToUniversalTime().Ticks; // false 

będę oczekiwać kleszcze z DateTime być oparte na czas UTC. Na stronie MSDN na DateTime.Ticks wspomina mówi

Wartość tej właściwości reprezentuje liczbę odstępach 100-nanosekundowych, które upłynęły od 12:00:00 północy, 1 stycznia 0001, która reprezentuje DateTime.MinValue. Nie obejmuje liczby kleszczy, które można przypisać do sekund przestępnych.

Północ od pierwszego stycznia 0001 .. w której strefie czasowej?

Dlaczego funkcja DateTime.Ticks jest zależna od strefy czasowej?

Myślę, że fakt, że kleszcze są różne dlatego następujący kod zwraca również fałszywe

DateTime d = DateTime.Now; 
d == d.ToUniversalTime(); // false 

MSDN doc na DateTime.Equals wspomina

t1 i t2 są równe, jeśli ich własności kleszcze wartości są równe. Ich wartości właściwości Kind nie są uwzględniane w teście na równość.

Moje oczekiwania były takie, że DateTime.Ticks będzie równa, bez względu na strefę czasową.

Spodziewam się, że dwie chwile w czasie będą równe bez względu na to, w którym miejscu zdarzenia się pojawiły. Czy moje oczekiwania są błędne?

+1

Należy pamiętać, że można użyć funkcji DateTimeOffset (http://msdn.microsoft.com/en-us/library/system.datetimeoffset.op_equality.aspx), która porównuje moment w czasie porównywania dwóch wystąpień. –

+0

@ChrisShaffer Dzięki, myślę, że właśnie tego powinienem używać, ponieważ to, czego szukam, to dokładne momenty w czasie, a nie rzeczywiste "daty". – GuiSim

Odpowiedz

9

źródło: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fde7e5b0-e2b9-4d3b-8a63-c2ae75e316d8

DateTime.Ticks jest udokumentowane jako "liczby przedziałów 100 nanosekundowych , które upłynęły od 12:00:00 północy, 1 stycznia 0001". To jest 1-Jan-0001 czasu lokalnego.Jeśli skonwertujesz DateTime na UTC, liczba odcisków będzie wynosić 100-nanosekundowych interwałów, które upłynęły od 01:00 do 16:00, od 1 stycznia 0001 północy, 1 stycznia 0001 UTC. Potencjalnie inny , że 1-Jan-0001 czasu lokalnego, ergo dwie wartości kleszczy będzie różne.

0

DateTime.Now jest określany na podstawie twojego przesunięcia strefy czasowej, co oznacza, że ​​nie będzie taki sam jak czas uniwersalny, chyba że twoje przesunięcie wynosi zero. Nie ma sensu przekształcanie DateTime.Now w tyknięcia w dwóch różnych strefach czasowych i uzyskanie tego samego wyniku - są to te same bezwzględne czasy (UTC), ale nie ten sam względny czas (przy zastosowaniu przesunięcia strefy czasowej).

1

Twoja obecna data (chyba że mieszkasz w jednej określonej strefie czasowej - GMT) jest przesunięta o godzinę UTC o x godzin, więc DateTime.Now może ustawić Cię na 4 rano, podczas gdy Datetime.Now.ToUniversalTime() może być o 23:00 w zależności od Twojej aktualnej strefy czasowej.

kleszcze są obliczane po konwersja z twojej strefy czasowej do czasu uniwersalnego, więc tylko czas powinien być równy jest, jeśli mieszkają w strefie czasowej GMT.

Mówiąc prościej, liczba ticków między 1/1/2011 8:00 AM to nie to samo, co liczba ticków od 01.01.2011, 23.00. W twoim kodzie data jest konwertowana na datę uniwersalną, a następnie po prawej stronie równania są wyliczane tyknięcia, ale po prostu używasz lokalnej daty, aby uzyskać różnicę po lewej stronie, więc są one! inny.

+0

Zakładam, że te dwie wartości będą równe, ponieważ reprezentują dokładnie ten sam moment w czasie. Nie spodziewałem się, że zmiana układu odniesienia zmieniłaby równość. – GuiSim

+2

@GuiSim - Ten pierwszy wiersz nie powinien być w mojej odpowiedzi. Kiedy przeczytałem go ponownie, brzmiało to jakbym był protekcjonalny. Przepraszam za to. Nie chciałem być. Jestem po prostu okropny w pisemnej komunikacji. – David

Powiązane problemy