为什么这个错?

时间:2012-11-01 04:54:18

标签: c# string datetime

记录的价值。时间是“11/01/2012 11:38:01:296”

string[] capturetime = record.Time.Split(':');
string captime = capturetime[0] + ":" + 
                 capturetime[1] + ":" + 
                 capturetime[2] + "." + 
                 capturetime[3];
DateTime rightTime = Convert.ToDateTime(captime);

在第二行之后,captime的值是“11/01/2012 11:38:01.296” 错误出现在最后一行:“索引和长度必须引用字符串中的位置。 参数名称:lengthmscorlib“

我不明白为什么。因为它之前运行良好:(任何人都可以解释这个?tks这么多

解决了,非常感谢每个人:)

代码:

 string[] capturetime = newRecord.Time.Split(':');
                string captime = capturetime[0] + ":" + capturetime[1] + ":" + capturetime [2] + "." + capturetime[3];
                DateTime righttime;

                if(time[3].Length == 2)
                {
                    righttime = DateTime.ParseExact(captime, "MM/dd/yyyy hh:mm:ss.ff",
                                                     CultureInfo.InvariantCulture);
                } else
                {
                    righttime = DateTime.ParseExact(captime, "MM/dd/yyyy hh:mm:ss.fff",
                                                    CultureInfo.InvariantCulture);
                }

那么优化那些代码的任何想法????

更新:

是我还是我的Visual Studio很疯狂?上面的新代码像旧代码一样异常,当我改回旧代码时。它像旧日一样工作正常..这是:(

4 个答案:

答案 0 :(得分:2)

您可以使用

string dateString =  "11/01/2012 11:38:01:296";    
DateTime date = DateTime.ParseExact(dateString , "MM/dd/yyyy hh:mm:ss:fff",
                                                CultureInfo.InvariantCulture);

答案 1 :(得分:0)

如果你仔细观察,你给出的时间,没有最后一个COLON。按照正常标准,它将是一个点。 正确检查RecordTime值。

“11/01/2012 11:38:01:296”是错的 “11/01/2012 11:38:01.296”是正确的

因此使captureTime的索引错误。它将是0,1和2。 3将超出范围。

答案 2 :(得分:0)

只使用DateTime.ParseExact(val,“MM / dd / yyyy HH:mm:ss:fff”,新的DateTimeFormatInfo())而不进行所有字符串拆分。

答案 3 :(得分:0)

我认为解决这个问题的最佳方法是使用CultureInfo / DateTimeFormat字符串。

但是,如果由于某些奇怪的原因而不适合你,这是一种粗暴的做法。

        string val = @"11/01/2012 11:38:01:296";
        string[] parts = val.Split(' ');
        var dt = DateTime.ParseExact(parts[0], "dd/MM/yyyy", new DateTimeFormatInfo());
        double[] times = parts[1].Trim().Split(':').Select(s => double.Parse(s)).ToArray();
        dt = dt.AddHours(times[0]);
        dt = dt.AddMinutes(times[1]);
        dt = dt.AddSeconds(times[2]);
        dt = dt.AddMilliseconds(times[3]);

        // OR -- dt.AddMilliseconds(times[0] * 60 * 60 * 1000 + times[1] * 60 * 1000 + times[2] * 1000 + times[3]);