2011-08-22 35 views
5

Tôi đang cố gắng chuyển đổi một String thành một đối tượng Datetime mà không sửa đổi nó và thêm một giờ/offset vào đối tượng Datetime.Bỏ qua DST (Daylight Saving Time) trong .NET

Đây là mã:

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS 

DateTime date = Convert.ToDateTime(dateStr); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("date toString: " + date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK")); 

Sản lượng:

Original string: 2011-03-18T12:07:00.000+10:00 
date toString: 2011-03-18T13:07:00.000+11:00 

Nếu bất cứ ai có thể chỉ làm thế nào tôi có thể bỏ qua DST hoặc đơn giản thậm chí chuyển đổi ngày trở lại với những gì tôi muốn như một đối tượng Ngày giờ, điều đó sẽ được nhiều người đánh giá cao.

Đi xuống con đường của việc sửa đổi datetime: Tôi đã cố gắng để chuyển đổi Datetime trở lại nhưng tôi không thể làm việc ra làm thế nào để thay đổi múi giờ trong đối tượng Datetime và khi tôi sử dụng một đối tượng DateTimeOffset để làm công việc này, khi tôi gọi là DatetimeOffset.Datetime nó trả về datetime mà không có sự bù đắp

+0

Bạn đang sử dụng phiên bản .NET nào? –

+0

Đây là trong .NET 3.5. Có URL nào cho Thời gian Noda của Jon Skeet không? – Eiji

+0

@Eiji, http://code.google.com/p/noda-time/ – Amy

Trả lời

0

TimezoneInfo lớp trong .NET framework có thể cung cấp câu trả lời (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx)

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS 

DateTime localDateTime = DateTime.Parse(date); 

DateTime utcDateTime = localDateTime.ToUniversalTime(); 
string estKey = "Eastern Standard Time"; 
TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById(estKey); 
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, estTimeZone); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("date toString: " + estDateTime); 
+0

Đánh giá cao sự trợ giúp, nhưng tiếc là chúng tôi mất bù đắp trong ** estDatetime ** với phương thức đó. – Eiji

3

Một DateTime đối tượng không chứa múi giờ. Nó chỉ chứa một số Kind, có thể là Utc, Local hoặc Unspecified.

Khi gọi Convert.ToDateTime, nếu bất kỳ bù đắp hiện diện, mà bù đắp sẽ được áp dụng và sau đó giá trị sẽ được chuyển đổi sang múi giờ địa phương . Đó là - múi giờ nơi mã đang chạy.

Sau đó, bằng cách sử dụng K ở định dạng đầu ra, nó trả về độ lệch múi giờ địa phương cho ngày cụ thể đó.

Để xử lý tình huống này một cách chính xác, sử dụng DateTimeOffset loại:

string dateStr = "2011-03-18T12:07:00.000+10:00"; 

DateTimeOffset dto = DateTimeOffset.Parse(dateStr); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("dto toString: " + dto.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK")); 

Về tuyên bố của bạn:

khi tôi gọi là DatetimeOffset.Datetime nó trả về Datetime mà không có sự bù đắp

Điều đó là chính xác. Chỉ có loại DateTimeOffset có bù đắp để trả lại. Đối tượng DateTime chỉ có thể trả về số tiền cục bộ của máy hoặc bằng 0 cho số DateTime với DateTimeKind.Utc.

-1

DateTime dt = DateTime.Now.ToUniversalTime() + TimeZoneInfo.Local.BaseUtcOffset;

+0

Điều này áp dụng chính xác múi giờ đã cho trong khi * bỏ qua * DST, như đã được yêu cầu ban đầu. – Timo

Các vấn đề liên quan