2010-02-18 18 views
2

以下代碼:下面的DateTime/TimeZone示例有什麼問題?

var dateTime1 = DateTime.Now; 
var str = dateTime1.ToString("dd-MMM-yyyy HH:mm:sszzz"); 
Console.WriteLine(str); 

var dateTime2 = dateTime1.ToUniversalTime(); 
str = dateTime2.ToString("dd-MMM-yyyy HH:mm:ss"); 
Console.WriteLine(str); 

var dateTime3 = TimeZoneInfo.ConvertTimeFromUtc(dateTime2, TimeZoneInfo.Local); 
str = dateTime3.ToString("dd-MMM-yyyy HH:mm:sszzz"); 
Console.WriteLine(str); 

打印爲例外:

18-FEB-2010 09:07:06-05:00
18-FEB-2010 14時07分06秒
18月2010年09:07:06-05:00

在另一方面代碼:

var dateTime1 = DateTime.ParseExact("20090615013505-0400", "yyyyMMddHHmmsszzz",null); 
var str = dateTime1.ToString("dd-MMM-yyyy HH:mm:sszzz"); 
Console.WriteLine(str); 

var dateTime2 = dateTime1.ToUniversalTime(); 
str = dateTime2.ToString("dd-MMM-yyyy HH:mm:ss"); 
Console.WriteLine(str); 

var dateTime3 = TimeZoneInfo.ConvertTimeFromUtc(dateTime2, TimeZoneInfo.Local); 
str = dateTime3.ToString("dd-MMM-yyyy HH:mm:sszzz"); 
Console.WriteLine(str); 

打印這樣的:

15君2009 01:35:05-04:00
15君2009 5點35分05秒
15君2009 1時35: 05-04:00

我預計最後一行是15-Jun-2009 00:35-05:00,因爲當地時區爲GMT-05:00。

我在這裏錯過了什麼?

+0

,你希望我們讀了嗎?請使您的問題中的代碼示例可讀。 – Steven 2010-02-18 14:26:44

+0

您還應該檢查您的問題並發表評論或定期接受。 – Kylar 2010-02-26 18:28:35

回答

4

一個例子是在二月份(當夏令關閉),一個在六月(當夏令時生效。)

由於UTC不會改變,你的偏移會的1小時中少夏令時。 (按照你的抵消,它看起來像你在東部標準/東部夏令時)。

1

dateTime1正在獲取當前的文化設置,所以當它轉換爲UTC時,它將返回到本地時間。

2

DateTime的情況下,沒有他們是在什麼時間區中的任何概念從MS help for custom date time format strings

出於這個原因,不推薦使用DateTime值使用Z格式說明。使用的DateTimeOffset代替

嘗試:

var dateTime1 = DateTimeOffset.ParseExact("20090615013505-0400", "yyyyMMddHHmmsszzz", null); 
var str = dateTime1.ToString("dd-MMM-yyyy HH:mm:sszzz"); 
Console.WriteLine(str); 
var dateTime2 = dateTime1.ToUniversalTime(); 
str = dateTime2.ToString("dd-MMM-yyyy HH:mm:ss"); 
Console.WriteLine(str); 
var dateTime3 = dateTime2.ToLocalTime(); 
str = dateTime3.ToString("dd-MMM-yyyy HH:mm:sszzz"); 
Console.WriteLine(str);