我试图从datetime字段获取SubString。我从这样的数据集中得到这个字段:
fecha_nacimiento = row[7].ToString().Substring(1,9);
编译器没有说出任何错误,但是当我执行时我得到以下错误:
start index不能超过string的长度。
我重复一遍,行[7] .ToString的值是11/11/2010 0:00:00
答案 0 :(得分:2)
在该行上放置一个断点并为此值添加一个监视:
row[7].ToString()
在我看来它是空的。
此代码有助于理解这一点:
string date = row[7].ToString();
if (!String.IsNullOrEmpty(date) && date.Length > 8)
{
fecha_nacimiento = date.Substring(1,9);
}
正如评论所示,有更好的方法来解析日期!
答案 1 :(得分:1)
首先,该错误意味着你有一个空字符串或一个字符长的字符串 - 它在第1位没有字符(记住,它们从索引0开始)。
其次,如果该单元格中的数据已经是DateTime,则使用其中一种DateTime方法获取字符串(ToString
,ToShortDateString
或ToLongDateString
)你需要。像这样:
fecha_nacimiento = ((DateTime)row[7]).ToShortDateString();
编辑如果您只想使用ToString
方法,则无需进行投射。
否则,首先parse到DateTime,然后使用这些方法。
答案 2 :(得分:1)
正如您已经证明该字符串包含“22/11/2010 0:00:00”。使用
row[7].ToString("d") which will result in "22/11/2010"
此处:http://msdn.microsoft.com/de-de/library/zdtaw1bw(v=vs.80).aspx
[编辑] Renan当然是正确的,当他声明这只有在数据源中包含的对象是DateTime类型时才有效。有关更多详细信息,请参阅上面的答案。
答案 3 :(得分:0)
您可以尝试在方法“tostring()”
中使用该模式您可以从许多现有格式中进行选择。观看这里的官方文档
http://msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.80).aspx
像这样:
string fecha_nacimiento = string.Empty;
if(row[7] != null)
{
if(row[7].toString() != string.Empty)
{
string fecha_nacimiento = row[7].ToString("yyyy-MM-dd hh:mm");
//OR
string fecha_nacimiento = row[7].ToString("yyyy-MM-dd");
// etc...
}
}
答案 4 :(得分:0)
这意味着row[7].ToString()
的长度为0.
只是为了证明一点,如果你这样做:
string test = string.Empty;
Console.WriteLine(test.Substring(1, 9));
它会给你完全相同的错误信息。