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

标签 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"

这是微软的愚人节玩笑吗?

最佳答案

“不正确”的结果(正如 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.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 点,反射(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 值,其 DateTimeOffset 属性设置为解析的日期、时间和偏移量。 但请注意:如果字符串中的时区偏移量与您要使用的时区不匹配,则您需要自行调整结果日期和时间。

关于c# - 在 ASP.NET 中使用 C# 将字符串转换为日期让我有一个小时的约会。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755086/

相关文章:

javascript - 如何将参数传递给 PdfAction.JavaScript(jscode, stapmer.Writer)

c#运行时丢失引用

c# - 你会如何制作一个 "Favorite Pages"系统

c# - 如何判断应用程序是否正在调试

c# - 如何在 asp.net 的 ViewState 中存储数组?

c# - 从 ASP Web Api IHttpActionResult 反序列化 byte[]

python - Pandas 数据框适用于日期时间列 : does not work

正则表达式拆分任何不是数字的东西

java - 如何在java中格式化日期字符串?

C# 使用 FileSystemWatcher 跟踪文件夹连接