我是C#的新手。
我有不同的文件名。例如:
C:\测试\ ABCD \ Warranty_2018_02_12__13_25_13.743.xml
从这个名字我想得到日期,比如 12.02.2018 13:25:13
所以文件永远不会相同。
我的代码:
public string GetCreationDate(string fileResult)
{
int index = fileResult.IndexOf("_");
if (index != -1)
{
string date = fileResult.Substring(index + 1, 20);
char[] delimiter = new char[] { '_' };
string[] dateWithoutLines = date.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
Array.Reverse(dateWithoutLines, 0, 3);
//Here is the error
//Guess it's because of the 'ToString()'
DateTime dateTime = DateTime.ParseExact(dateWithoutLines.ToString(), "dd/MM/yyyy hh:mm:ss",
System.Globalization.CultureInfo.InvariantCulture);
return dateTime.ToString();
}
return null;
}
在调试器中,我现在在 dateWithoutLines 中有6个字符串,并且具有正确的日期。喜欢" 12" " 02" " 2018" ...
但后来它说这不是一个正确的DateTime格式。好的,但如果我删除了
ToString()
它说它不能将string []转换为字符串。那么这里有什么问题?
答案 0 :(得分:1)
dateWithoutLines
是string[]
。 ToString
的{{1}}实现会产生" System.String []" ,这不是有效日期。此外,string[]
不会使用DateTime.Parse
,而只会使用字符串。
如果文件名中的日期格式始终相同,则可以使用string[]
string.Format
花括号中的数字通过索引引用传递的数组中的对象,即var formattedDate = string.Format("{2}.{1}.{0} {3}:{4}:{5}", dateWithoutLines);
将在您的示例中由{2}
替换,12
由{1}
替换为02
等等。 请注意我使用了原始订单中的索引,而不是反转数组。
由于您正在解析日期以对其进行格式化,因此不需要解析,因为它已经格式化了。
答案 1 :(得分:1)
无需拆分原始字符串,反向,合并等等。
让DateTime.TryParseExact
为您完成所有工作:
另外,请考虑返回可为空的DateTime(DateTime?
)而不是字符串:
public DateTime? GetCreationDate(string fileResult)
{
int index = fileResult.IndexOf("_");
if (index <= 0)
return null;
// check for string length, you don't want the following call to fileResult.Substring to throw an exception
if (fileResult.Length < index+20)
return null;
string date = fileResult.Substring(index + 1, 20);
DateTime dt;
if (DateTime.TryParseExact(date, "yyyy_MM_dd__HH_mm_ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
return dt;
return null;
}
答案 2 :(得分:0)
对象实例dateWithoutLines
是一个字符串数组,而不是单个字符串,因此您无法使用方法ToString()
。
所以我相信你想要的东西是:
foreach (string date in dateWithoutLines)
{
DateTime dateTime = DateTime.ParseExact(date, "dd/MM/yyyy hh:mm:ss",
System.Globalization.CultureInfo.InvariantCulture);
}
请注意,由于您有一个字符串数组,因此date是一个字符串对象,因此不需要为每个ToString()
字符串实例调用date
方法