Đây là một câu hỏi hay. Tôi đang khôi phục nó để cung cấp thêm một chút chi tiết về cách .Net hành xử với các Kind
giá trị khác nhau . Như @Jan Zich chỉ ra, Đây thực sự là một tài sản cực kỳ quan trọng và được đặt khác nhau tùy thuộc vào việc bạn sử dụng Now
hay UtcNow
.
Bên trong ngày được lưu trữ theo Ticks
đó (trái với câu trả lời của @Carl Camera) là khác nhau tùy thuộc vào việc bạn sử dụng Now
hay UtcNow
.
DateTime.UtcNow
cư xử như các ngôn ngữ khác. Nó đặt Ticks
thành giá trị dựa trên GMT. Nó cũng đặt Kind
ra Utc
.
DateTime.Now
thay đổi Ticks
giá trị thành giá trị của nó nếu đó là thời gian trong ngày của bạn trong múi giờ GMT . Nó cũng đặt Kind
ra Local
.
Nếu bạn chậm 6 giờ (GMT-6), bạn sẽ nhận được thời gian GMT từ 6 giờ trước. .Net thực sự bỏ qua Kind
và xử lý lần này như thể là 6 giờ trước, mặc dù nó được coi là "bây giờ". Điều này thậm chí còn phá vỡ nhiều hơn nếu bạn tạo một DateTime
thể hiện sau đó thay đổi múi giờ của bạn và cố gắng sử dụng nó.
Các trường hợp DateTime với các giá trị 'Loại' khác nhau KHÔNG tương thích.
Hãy xem một số mã ...
DateTime utc = DateTime.UtcNow;
DateTime now = DateTime.Now;
Debug.Log (utc + " " + utc.Kind); // 05/20/2015 17:19:27 Utc
Debug.Log (now + " " + now.Kind); // 05/20/2015 10:19:27 Local
Debug.Log (utc.Ticks); // 635677391678617830
Debug.Log (now.Ticks); // 635677139678617840
now = now.AddHours(1);
TimeSpan diff = utc - now;
Debug.Log (diff); // 05:59:59.9999990
Debug.Log (utc < now); // false
Debug.Log (utc == now); // false
Debug.Log (utc > now); // true
Debug.Log (utc.ToUniversalTime() < now.ToUniversalTime()); // true
Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() > now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() - now.ToUniversalTime()); // -01:00:00.0000010
Như bạn có thể thấy ở đây, các phép so sánh và hàm toán học không tự động chuyển đổi thành thời gian tương thích. Đáng Timespan
lẽ đã gần một giờ, nhưng thay vào đó là gần 6. "utc <now" đáng lẽ phải đúng (tôi thậm chí đã thêm một giờ để chắc chắn), nhưng vẫn sai.
Bạn cũng có thể thấy 'công việc xung quanh', đơn giản là chuyển đổi sang thời gian phổ quát ở bất cứ nơi nào Kind
không giống nhau.
Câu trả lời trực tiếp của tôi cho câu hỏi đồng ý với đề xuất của câu trả lời được chấp nhận về thời điểm sử dụng mỗi câu hỏi. Bạn phải luôn cố gắng làm việc với DateTime
các đối tượng có Kind=Utc
, ngoại trừ trong quá trình i / o (hiển thị và phân tích cú pháp). Điều này có nghĩa là bạn hầu như luôn luôn được sử dụng DateTime.UtcNow
, ngoại trừ các trường hợp bạn đang tạo đối tượng chỉ để hiển thị nó và loại bỏ nó ngay lập tức.