2011-08-22 65 views
5

我想將字符串轉換爲日期時間對象,而無需修改它並向Datetime對象添加額外的小時/偏移量。在.NET中忽略DST(夏令時)

這是代碼:

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")); 

輸出:

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

如果任何人都可以點我怎麼能忽略DST或者乾脆甚至轉換追溯到我想要什麼作爲日期時間對象,這將非常感激。

下鄉修改日期時間的路徑: 我試圖日期時間轉換回來,但我不知道如何改變時區的DateTime對象,當我使用的DateTimeOffset對象做這項工作,當我打電話的DatetimeOffset.Datetime返回日期時間不偏移

+0

您使用的是什麼版本的.NET? –

+0

這是在.NET 3.5中。 是否有Jon Skeet的Noda Time的URL? – Eiji

+0

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

回答

0
在.NET框架

的TimeZoneInfo類可以提供答案(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

欣賞幫助,但不幸的是,我們在** estDatetime **中使用該方法失去了抵消。 – Eiji

3

DateTime對象不包含時區。它只包含一個Kind,它可以是Utc,LocalUnspecified

當調用Convert.ToDateTime,如果任何偏移存在時,該偏移量將被應用,然後該值將被轉換爲本地時區。那就是 - 代碼運行的時區。

然後,通過在輸出格式中使用K,它將返回該特定日期的本地時區的偏移量。

要正確處理這種情況下,使用DateTimeOffset類型:

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")); 

關於你的語句:

當我打電話的DatetimeOffset.Datetime它返回日期沒有偏移

這是正確的。只有DateTimeOffset類型具有要返回的偏移量。 DateTime對象只能返回本機的本地偏移量,或者的DateTime爲零。

-1

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

+0

正如最初所要求的那樣,這正確地應用給定的時區,同時忽略* DST。 – Timo