2010-07-23 51 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