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")。
根据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。