Convert.ToDateTime()的意外行为

时间:2014-06-19 16:49:16

标签: c# .net datetime

请考虑以下代码段:

DateTime dt = Convert.ToDateTime("06/16/2014 -0:10");
Console.Write (dt.ToString());
Console.ReadKey();

输出为6/15/2014 8:10:00 PM

这是在测试Web应用程序时出现的,其中允许手动输入一天中的时间(日期,HH和MM在单独的ASP.Net文本框控件中),并且字符最初不限于仅数字(ASP。 net验证器控件接受" -0"为0..23范围内的整数。)

有人可以解释逻辑如何将字符串转换为此日期/时间吗?我要么会期待抛出异常,要么" 6/16/2014 12:10:00 AM"考虑" -0"与" 0"相同(" 06/16/2014 0:10"转换为" 2014年6月16日12:10:00 AM"正如人们所期望的那样)。

3 个答案:

答案 0 :(得分:4)

According to MSDN我认为你设定的时区是-10分钟。

dateString = "2009-05-01T07:54:59.9843750-04:00";
Convert.ToDateTime(dateString);
//    '2009-05-01T07:54:59.9843750-04:00' converts to 5/1/2009 4:54:59 AM Local time.

答案 1 :(得分:2)

正如@LIUFA已经注意到的,这是首先解析字符串然后转换为本地时间的结果。 -0:10被解释为-10分钟的时区偏移,时间部分根本没有指定,因此被解释为午夜。

要了解会发生什么,首先将字符串解析为DateTimeOffset

> DateTimeOffset.Parse("06/16/2014 -0:10", CultureInfo.InvariantCulture)
16.06.2014 00:00:00 -00:10

然后转换为当地时间(在您的情况下为GMT-4:00)

> time.ToLocalTime()
15.06.2014 20:10:00 -04:00

答案 2 :(得分:1)

我相信文本的-0部分被视为时区,相对于当地时间。这将导致程序占用本地小时并将分钟设置为字符串中给出的十分钟。