2010-07-23 50 views
30

我有一個DateTime存儲在世界時間(UTC)值2010-01-01 01:01:01datetime與時區字符串

我想在EST這種格式2010-01-01 04顯示出來:01:01GMT,04:00,但是 'K' 格式化的時區不工作的ToString

+0

您是否有世界時(UTC)或格林威治標準時間(GMT)的時間? – Guffa 2010-07-23 23:46:55

+0

對不起,錯字 – Comma 2010-07-23 23:58:06

回答

48

使用「ZZZ」格式說明,以獲得UTC偏移。例如:

 var dt = new DateTime(2010, 1, 1, 1, 1, 1, DateTimeKind.Utc); 
     string s = dt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz"); 
     Console.WriteLine(s); 

輸出: 2009-12-31 19點01分01秒格林尼治標準時間06:00

我在CDT時區。確保DateTime明確DateTimeKind.Utc。

+3

格林威治標準時間沒有歧義夏時制。它不改變夏時制。 – 2015-12-05 01:40:27

3

類似這樣的工作。你也許可以清理多一點:

string newDate = string.Format("{0:yyyy-MM-dd HH:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K")); 
+1

你可能意味着'HH',而不是'hh'。 – Sasha 2017-03-06 10:42:34

+0

可能......「hh」給出了12小時制結果,其中「HH」給出了軍事時間結果。 – Robaticus 2017-03-07 13:31:52

+0

Robaticus,我的意思是12小時格式與您答案的其餘部分不兼容,因爲您沒有指定AM/PM。即應該加上't' /'tt'來使'hh'有意義(例如'02:00 AM','03:00 PM'),或者'hh'應該替換爲'HH'來產生24小時格式(例如'02:00','15:00')。所以'yyyy-MM-dd hh:mm:ss'格式產生的模糊輸出不能被解碼回來:(。 – Sasha 2017-03-07 14:04:42

1

此方法將返回在東部標準時間指定時間(作爲問題的要求),即使EST不在本地時區

public string GetTimeInEasternStandardTime(DateTime time) 
{ 
    TimeZoneInfo easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    DateTimeOffset timeInEST = TimeZoneInfo.ConvertTime(time, easternStandardTime); 
    return timeInEST.ToString("yyyy-MM-dd hh:mm:ss tt\" GMT\"zzz"); 
} 

注:我沒有測試過這個非英語操作系統。請參閱TimeZoneInfo.FindSystemTimeZoneById上的MSDN文檔。

+1

@Sasha這是一個好點,這個答案之前並沒有消除AM和PM之間的歧義。在時間格式字符串中添加「tt」以添加AM/PM。根據您的評論,您可以用「HH」替代「hh」以使用24小時制(從00到23)輸出小時數。 – 2017-03-06 14:46:01