2012-04-20 43 views
9

Làm thế nào đến đoạn code sau (trong C#) trả về false:DateTime.Ticks, DateTime.Equals và múi giờ

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

tôi mong đợi sự ve của một DateTime được dựa trên thời gian tính theo giờ UTC. Trang MSDN trên DateTime.Ticks đề cập nói

Giá trị tài sản này đại diện cho số của khoảng 100 nano giây đã trôi qua kể từ 12:00:00 nửa đêm, 01 tháng 1, 0001, đại diện cho DateTime.MinValue. Nó không bao gồm số lượng ve được quy cho giây nhảy vọt.

Nửa đêm vào ngày 1 tháng 1, 0001 .. trong múi giờ nào?

Tại sao DateTime.Ticks sẽ phụ thuộc vào múi giờ?

Tôi đoán rằng thực tế là Bọ ve là khác nhau là tại sao đoạn code sau đây cũng trả về false

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

MSDN doc trên DateTime.Equals đề cập

t1 và t2 đều bình đẳng nếu sở hữu Bọ ve của họ giá trị bằng nhau. Các giá trị tài sản Kind của chúng không được xem xét trong bài kiểm tra bình đẳng.

Kỳ vọng của tôi là DateTime.Ticks sẽ bằng nhau, bất kể múi giờ.

Tôi mong đợi hai khoảnh khắc trong thời gian bằng nhau bất kể họ đã xảy ra múi giờ nào. Kỳ vọng của tôi có sai không?

+1

Lưu ý rằng bạn có thể sử dụng DateTimeOffset (http://msdn.microsoft.com/en-us/library/system.datetimeoffset.op_equality.aspx) so sánh thời điểm trong khi so sánh hai trường hợp. –

+0

@ChrisShaffer Cảm ơn, tôi nghĩ rằng đây là những gì tôi nên sử dụng vì những gì tôi đang tìm kiếm là những khoảnh khắc chính xác trong thời gian và không thực tế "ngày". – GuiSim

Trả lời

9

nguồn: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fde7e5b0-e2b9-4d3b-8a63-c2ae75e316d8

DateTime.Ticks được ghi lại là "số lượng khoảng 100 nano giây đã trôi qua kể từ 12:00:00 nửa đêm, ngày 1 tháng 1, 0001". Đó là 1-Jan-0001 giờ địa phương.Nếu bạn chuyển đổi DateTime thành UTC, Ticks sau đó sẽ là số khoảng 100 nano giây đã trôi qua kể từ 12:00:00 nửa đêm, ngày 1 tháng 1, 0001 giờ UTC. Có khả năng khác nhau thời gian địa phương 1-Jan-0001, ergo hai giá trị Ticks sẽ là khác nhau.

0

DateTime.Now được xác định dựa trên chênh lệch múi giờ của bạn có nghĩa là nó sẽ không giống như thời gian quốc tế trừ khi bù đắp của bạn bằng 0. Nó sẽ không có ý nghĩa để chuyển đổi DateTime.Now để đánh dấu trong hai múi giờ khác nhau và nhận được kết quả tương tự - chúng là cùng thời gian tuyệt đối (UTC), nhưng không cùng thời gian tương đối (sử dụng chênh lệch múi giờ).

1

Ngày giờ hiện tại của bạn (trừ khi bạn sống trong một múi giờ cụ thể - GMT) được bù trừ từ thời gian UTC x giờ, vì vậy DateTime.Now có thể đặt bạn lúc 4 giờ sáng trong khi Datetime.Now.ToUniversalTime() có thể là lúc 11 giờ tùy thuộc vào múi giờ hiện tại của bạn.

Các Bọ ve được tính sau việc chuyển đổi từ múi giờ của bạn để thời gian phổ quát, nên thời gian duy nhất họ cần được bình đẳng là nếu bạn sống ở múi giờ GMT.

Đặt đơn giản hơn, số lượng bọ ve trong khoảng thời gian từ 1/1/2011 8:00 SA không giống như số lượng bọ ve kể từ 1/1/2011 11:00 PM. Trong mã của bạn, ngày đang được chuyển đổi sang ngày phổ quát, và sau đó đánh dấu được tính toán ở phía bên phải của phương trình, nhưng nó chỉ sử dụng ngày địa phương của bạn để có được sự khác biệt ở bên trái, do đó, chúng! khác.

+0

Tôi giả sử hai sẽ bằng nhau vì chúng đại diện cho cùng một thời điểm chính xác. Tôi không ngờ rằng sự thay đổi trong khung tham chiếu sẽ thay đổi sự bình đẳng. – GuiSim

+2

@GuiSim - Dòng đầu tiên đó không nên có trong câu trả lời của tôi. Khi tôi đọc lại nó, có vẻ như tôi đang bị hạ mình. Xin lỗi vì điều đó. Tôi không có ý. Tôi chỉ là khủng khiếp khi giao tiếp bằng văn bản. – David