以下代码:
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-Feb-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-Jun-2009 01:35:05-04:00
2009年6月15日05:35:05
15-Jun-2009 01:35:05-04:00
我预计最后一行为15-Jun-2009 00:35-05:00
,因为当地时区是GMT-05:00。
我在这里缺少什么?
答案 0 :(得分:4)
一个例子是2月份(夏令时关闭时),6月份(夏令时生效时)。
由于UTC不会更改,因此在夏令时期间,您的偏移量将减少一个小时。 (根据您的偏移,看起来您处于东部标准/东部夏令时)。
答案 1 :(得分:3)
DateTime实例没有任何关于它们所在时区的概念。来自MS help for custom date time format strings:
因此,建议不要将z格式说明符与DateTime值一起使用。
尝试使用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);
答案 2 :(得分:1)
dateTime1获取当前的文化设置,因此当它转换为UTC然后返回时它仍然是当地时间。