Convert.ToDateTime()的意外行为

本文关键字:意外 ToDateTime Convert | 更新日期: 2023-09-27 18:09:29

考虑以下代码片段:

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

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

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

有人能解释一下这个字符串如何转换为这个日期/时间的逻辑吗?我希望抛出一个异常或"6/16/2014 12:10:00 AM",考虑到"-0"与"0"相同("06/16/2014 0:10"转换为"6/16/2014 12:10:00 AM")。

Convert.ToDateTime()的意外行为

根据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.

@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

我认为将文本的-0部分作为时区,这是相对于当地时间的。这将导致程序取本地小时,并将分钟设置为字符串中给定的10。