我正在使用 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"
这是微软的愚人节玩笑吗?
最佳答案
“不正确”的结果(正如 darkmyst 的回答所解释的那样)是由于 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 点,反射(reflect)了从东部夏令时 (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
属性设置为解析的日期、时间和偏移量。 但请注意:如果字符串中的时区偏移量与您要使用的时区不匹配,则您需要自行调整结果日期和时间。
关于c# - 在 ASP.NET 中使用 C# 将字符串转换为日期让我有一个小时的约会。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755086/