我使用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"
这是四月的傻瓜笑话吗?
答案 0 :(得分:4)
它允许你所在的时区。时间字符串是带有时区的ISO8601格式。
答案 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.Parse
和DateTimeOffset.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
值,其DateTime
和Offset
属性设置为已解析的日期,时间和偏移量。 但请注意:如果字符串中的时区偏移量与您要使用的时区不匹配,则需要自行调整生成的日期和时间。
答案 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#正在执行的机器 - 这是另一个问题..