记录的价值。时间是“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很疯狂?上面的新代码像旧代码一样异常,当我改回旧代码时。它像旧日一样工作正常..这是:(
答案 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]);