在ASP.NET中使用C#将字符串转换为日期让我得到一个小时的约会。为什么?

时间:2012-03-18 00:48:57

标签: c# asp.net datetime

我使用VS2010,C#,ASP.NET编写以下代码:

DateTime dt = DateTime.Parse("2012-03-11T02:53:58-08:00"); //Date is taken from SQL database
string strDt = dt.ToString();   //Becomes: "3/11/2012 3:53:58 AM"
这是四月的傻瓜笑话吗?

3 个答案:

答案 0 :(得分:4)

它允许你所在的时区。时间字符串是带有时区的ISO8601格式。

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx

答案 1 :(得分:4)

“不正确”的结果(正如暗示的答案所解释的)是由于2012年3月11日凌晨2:38:58不是美国和加拿大观察日光的地区的有效日期和时间节约时间。显然,您的代码在其中一个区域的计算机上运行。

要将字符串转换为DateTime,忽略任何时区偏移,您可以调用DateTimeOffset.Parse然后检索结果的DateTime组件:

DateTime dt = DateTimeOffset.Parse("2012-03-11T02:53:58-08:00").DateTime;
string strDt = dt.ToString();  // "3/11/2012 2:53:58 AM"

更新:那么当原始字符串包含时区偏移量时,DateTime.ParseDateTimeOffset.Parse之间有什么区别?考虑这两个例子,假设您当前的时区是太平洋时间:

// Example 1: DateTime.Parse(String)
DateTime dt = DateTime.Parse("2012-03-11T06:00:00-04:00");
Console.WriteLine(dt.ToString("o"));  // 2012-03-11T03:00:00.0000000-07:00

DateTime.Parse使用偏移量将已解析的日期和时间调整为本地时间。请注意,时间从早上6点变为凌晨3点,反映了从东部夏令时(UTC-04:00)到太平洋夏令时(UTC-07:00)的转换。在您的问题中,时间已更改,因为DateTime.Parse会自动将时间从太平洋标准时间(UTC-08:00)调整为太平洋夏令时(UTC-07:00)。

// Example 2: DateTimeOffset.Parse(String)
DateTimeOffset dto = DateTimeOffset.Parse("2012-03-11T06:00:00-04:00");
Console.WriteLine(dto.DateTime.ToString("o"));  // 2012-03-11T06:00:00.0000000
Console.WriteLine(dto.Offset);                  // -04:00:00

DateTimeOffset.Parse更简单。它只返回DateTimeOffset值,其DateTimeOffset属性设置为已解析的日期,时间和偏移量。 但请注意:如果字符串中的时区偏移量与您要使用的时区不匹配,则需要自行调整生成的日期和时间。

答案 2 :(得分:3)

这不是一个笑话或时区问题。这是夏令时。谷歌“2012年夏令时”,结果如下:

  

夏令时(美国)于2012年3月11日星期日凌晨2:00开始,并于2012年11月4日星期日凌晨2:00结束。   亚利桑那州和夏威夷除外。在春天将你的时钟向前移动1小时,在秋天向前移动1小时(“向前弹回,向后退”)。

换句话说,无论在哪里观察夏令时,2012年3月11日凌晨2:53:58都没有。时钟从凌晨1:59:59直到凌晨2点跳到3: 00:00 AM。为什么你的sql datetime没有观察夏令时和c#正在执行的机器 - 这是另一个问题..