以下DateTime / TimeZone示例有什么问题?

时间:2010-02-18 14:20:24

标签: c# .net

以下代码:

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。

我在这里缺少什么?

3 个答案:

答案 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然后返回时它仍然是当地时间。