2015-04-14 16 views
6

Chúng tôi có một dòng mã:Cách xác định xem các giá trị trong một DateTime có hợp lệ không?

DateTime.Now.AddMinutes(-1); 

nào chạy lúc 2:00 vào buổi sáng của ngày 29 tháng ba năm 2015 tại Anh. Giá trị trả về là 1:59, tuy nhiên do việc chuyển đổi sang thời gian mùa hè 1:59 không thực sự xảy ra và khiến các ngoại lệ tiếp tục giảm xuống.

Theo tôi đây là một lỗi trong .NET tuy nhiên thay vì sửa chữa khung làm cách nào chúng ta có thể xác nhận rằng đây là một DateTime hợp lệ trước khi các dòng sau ném các ngoại lệ?

Tôi thực sự đang tìm kiếm một phương pháp mở rộng dọc theo các dòng.

if(!theDate.IsValidInTimezone(TimeZoneInfo.Local)) 
{ 
    // the time is not valid 
} 
+5

Đang sử dụng một thư viện như Noda Thời gian một lựa chọn? – helb

+0

Bạn có thể vào DateTime-> Ticks-> DateTime và kiểm tra xem chuyến khứ hồi này có đến cùng thời điểm hay không. – DrKoch

+2

Còn việc làm DateTime.NowUtc.AddMinute (-1) .ToLocal (TimeZoneInfo.Local) –

Trả lời

2

Đây không phải là lỗi cho mỗi lần truy cập. DateTime không quan tâm đến việc bù đắp thực tế và nếu bạn đang làm bất kỳ loại thời gian nào, bạn nên sử dụng UTC.

Ví dụ:

DateTime dt = new DateTime(2015, 3, 29, 2, 59, 0, DateTimeKind.Local); 
    DateTime dt2 = dt.ToUniversalTime(); 
    Console.WriteLine(dt.ToString()); 
    Console.WriteLine(dt.AddMinutes(1).ToString()); 
    Console.WriteLine(dt2.AddMinutes(1).ToLocalTime().ToString()); 

này sẽ thấy sự khác biệt:

29.3.2015 2:59:00 
29.3.2015 3:00:00 
29.3.2015 4:00:00 

Vì vậy, luôn luôn xử lý ngày tháng trong UTC.

Hoặc bạn có thể sử dụng DateTimeOffset, ghi nhớ độ lệch thực tế. Và bạn có thể chuyển đổi thành giờ cục bộ:

DateTimeOffset dt = new DateTime(2015, 3, 29, 2, 59, 0, DateTimeKind.Local); 
    Console.WriteLine(dt.ToString()); 
    Console.WriteLine(dt.AddMinutes(1).ToString()); 
    Console.WriteLine(dt.AddMinutes(1).ToLocalTime().ToString()); 

Kết quả:

29.3.2015 2:59:00 +02:00 
29.3.2015 3:00:00 +02:00 
29.3.2015 4:00:00 +03:00 
Các vấn đề liên quan