我正在尝试从日期时间字段中获取子字符串。我从这样的数据集中得到这个字段:
fecha_nacimiento = row[7].ToString().Substring(1,9);
编译器没有说任何错误但是当我执行时我得到以下错误:
起始索引不能长于字符串的长度。
我再说一遍 row[7].ToString 的值是 11/11/2010 0:00:00
我正在尝试从日期时间字段中获取子字符串。我从这样的数据集中得到这个字段:
fecha_nacimiento = row[7].ToString().Substring(1,9);
编译器没有说任何错误但是当我执行时我得到以下错误:
起始索引不能长于字符串的长度。
我再说一遍 row[7].ToString 的值是 11/11/2010 0:00:00
在该行上放置一个断点并为此值添加一个监视:
row[7].ToString()
在我看来,它是空的。
这段代码将有助于捕捉到这一点:
string date = row[7].ToString();
if (!String.IsNullOrEmpty(date) && date.Length > 8)
{
fecha_nacimiento = date.Substring(1,9);
}
正如评论所示,有更好的方法来解析日期!
正如您已经证明该字符串包含“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 类型时才有效。有关更多详细信息,请参见上面的答案。
首先,该错误意味着您有一个空字符串或一个字符长的字符串 - 它在位置 1 处没有字符(请记住,它们从索引 0 开始)。
其次,如果该单元格中的数据已经是 DateTime,则使用DateTime方法之一来获取您需要的字符串 (ToString
或ToShortDateString
) ToLongDateString
。像这样:
fecha_nacimiento = ((DateTime)row[7]).ToShortDateString();
如果您只想使用该ToString
方法,则不需要EDIT Casting。
否则,首先将其解析为 DateTime,然后使用其中一个方法。
您可以尝试在方法“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...
}
}
这意味着它row[7].ToString()
的长度为 0。
只是为了证明一点,如果你这样做:
string test = string.Empty;
Console.WriteLine(test.Substring(1, 9));
它会给你完全相同的错误信息。