为什么c#的DateTime.Parse似乎不正确地解释字符串

本文关键字:不正确 正确地 解释 字符串 DateTime Parse 为什么 | 更新日期: 2023-09-27 18:09:32

谁能解释一下为什么下面的代码输出"4/14/2013 8:00:00 PM"?

var dt = "2013-04-15+00:00";
var result = DateTime.Parse(dt);

为什么c#的DateTime.Parse似乎不正确地解释字符串

许多方法来格式化日期/时间在不同的地区、文化、上下文等。当使用DateTime.Parse时,它将尽最大努力猜测要做什么,但是在确定哪种日期时间格式是合适的情况下,它通常是不成功的。

您可以使用DateTime.ParseExact来指定字符串用于格式化日期的确切格式。

我猜,安东尼·佩格兰姆的评论是对的。最有可能的是,它将字符串解释为一个日期,"2013-04-15",一个时区"+00:00",即GMT,而不是一天中的时间。默认的一天中的时间是午夜,所以结果日期等于"2013-04-15 at midnight GMT"。然后将其转换为比GMT晚4小时的本地时区,并输出如下所示。

如果可以,您应该使用更精确的日期/时间格式,如ISO 8601,它看起来像"2013-04-15T00:00:00-04:00",或"2013-04-15T00:00:00-04:00"

MSDN文档对此进行了深入的描述。

http://msdn.microsoft.com/en-us/library/1k1skd40 (v =应用程序). aspx

由于+00:00,它正在以UTC读取字符串。

这是因为它考虑了您的系统时区。然后适当调整指定的时间

字符串的"+00:00"部分被解释为时区。这是格林威治东部0小时0分钟的"地理"区域。

如果您希望"+00:00"部分是一天中的时间,则使用格式字符串,如下所示:

var dt = "2013-04-15+00:00";
var result = DateTime.ParseExact(dt, "yyyy-MM-dd+HH:mm", CultureInfo.InvariantCulture);

"HH""mm"表示一天(当地)时间的小时和分钟。相反,对于"yyyy-MM-ddzzz", "+00:00"部分将表示时区。