string.substring在我的字符串上失败

时间:2015-03-09 11:10:30

标签: c# string substring

我有以下代码:

string date = dtxt.Substring(5, 2) + @"/" + dtxt.Substring(7, 2) + @"/" + dtxt.Substring(0, 4);

我试图用它解析的文字是yyyyMMdd。所以从20150309我需要03/09/2015。我不使用dateTime格式,因为输入和输出都是字符串。

问题是我得到ArgumentOutOfRangeExceptionstring.Substring(X, Y)应该从X索引获取Y长度的子字符串,不应该吗?

2 个答案:

答案 0 :(得分:7)

在这种情况下不要使用字符串操作。

将其解析为DateTime并使用.ToString()方法格式化;

string s = "20150309";
DateTime dt;
if(DateTime.TryParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dt))
{
    dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture).Dump(); //03/09/2015
}

答案 1 :(得分:4)

您可以将此转换为DateTime,然后在ToString(string format, IFormatProvider provider)重载的帮助下返回任何字符串represanta:

 var result = DateTime.ParseExact(dtxt, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None)
                      .ToString("MM/dd/yyyy", CultureInfo.InvariantCulture);

并且在解析时不要忘记传递CultureInfo.InvariantCulture作为输入。并非所有文化都使用相同的日期和十进制货币值格式。 不变文化 是一种特殊的文化,您可以随时在任何.NET应用程序中使用它。


顺便说一下,你的代码中出现异常的原因是你没有正确找到月和日的起始索引。您可以将代码更改为:

string date = dtxt.Substring(4, 2) + @"/" + dtxt.Substring(6, 2) + @"/" + dtxt.Substring(0, 4);

但是,当然不建议对像这样的字符串使用操作。