我有以下代码:
string date = dtxt.Substring(5, 2) + @"/" + dtxt.Substring(7, 2) + @"/" + dtxt.Substring(0, 4);
我试图用它解析的文字是yyyyMMdd
。所以从20150309
我需要03/09/2015
。我不使用dateTime
格式,因为输入和输出都是字符串。
问题是我得到ArgumentOutOfRangeException
。 string.Substring(X, Y)
应该从X
索引获取Y
长度的子字符串,不应该吗?
答案 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);
但是,当然不建议对像这样的字符串使用操作。