Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Convert.ToDateTime()的意外行为_C#_.net_Datetime - Fatal编程技术网

C# Convert.ToDateTime()的意外行为

C# Convert.ToDateTime()的意外行为,c#,.net,datetime,C#,.net,Datetime,考虑以下代码段: DateTime dt = Convert.ToDateTime("06/16/2014 -0:10"); Console.Write (dt.ToString()); Console.ReadKey(); 输出为2014年6月15日晚上8:10:00 这是在测试web应用程序时出现的,允许手动输入一天中的时间(在单独的ASP.Net文本框控件中输入日期、HH和MM),并且字符最初不限于数字(ASP.Net验证程序控件接受“-0”为0..23范围内的整数) 有人能解释一下这个

考虑以下代码段:

DateTime dt = Convert.ToDateTime("06/16/2014 -0:10");
Console.Write (dt.ToString());
Console.ReadKey();
输出为2014年6月15日晚上8:10:00

这是在测试web应用程序时出现的,允许手动输入一天中的时间(在单独的ASP.Net文本框控件中输入日期、HH和MM),并且字符最初不限于数字(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”,正如人们所期望的那样)。

我认为您已将时区设置为-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.

我认为文本的-0部分被视为时区,它与当地时间有关。这将导致程序采用本地小时,并将分钟设置为字符串中给定的10。

正如@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)


所有这些都是正确的,除了输出中的日期是6/15,而原始字符串中的日期是6/16之外。我的当地时间是格林尼治标准时间-4@JoeSchmoe我还不习惯AM/PM符号。不要让用户以自由文本的形式插入日期,或者至少用定义良好的格式验证日期。大约有200万种表示时间和日期的方式相互冲突,你不想开始弄清楚用户输入了什么。2014年2月1日-这是2月2日还是1月1日?大家都说-0:10被视为时区偏移是正确的。如果使用2014年6月16日00:00-0:10作为输入字符串,则输出相同。它以2014年6月16日为日期,假设时间为午夜,因为未指定(所有时间均为UTC)。然后用我的当地时间(UTC-4)将时区调整到-0:10AK:我同意你所说的。FWIW日期未作为自由文本输入,日期部分的文本框设置为只读,值从jQuery datepicker控件捕获。
> time.ToLocalTime()
15.06.2014 20:10:00 -04:00