C# 从文件名获取日期时间
我有一个文件名为C# 从文件名获取日期时间,c#,file,datetime,tryparse,C#,File,Datetime,Tryparse,我有一个文件名为test-2000\u 01\u 02-10\u 12\u 14.xml 如何从文件中只获取日期 如果文件的名称是:2000\u 01\u 02-10\u 12\u 14,我就可以得到日期 使用此(b是一个StorageFile): 然后我试着把yyyyy\u MM\u dd-H\u MM\u ss改成这样的*-yyyy\u MM-dd-H-MM\u ss,但这似乎不是解决办法有很多方法可以做到这一点,这实际上取决于你的文件命名有多规范-是否总是有一些垃圾文本,然后是一年 如果你
test-2000\u 01\u 02-10\u 12\u 14.xml
如何从文件中只获取日期
如果文件的名称是:2000\u 01\u 02-10\u 12\u 14,我就可以得到日期
使用此(b
是一个StorageFile
):
然后我试着把yyyyy\u MM\u dd-H\u MM\u ss
改成这样的*-yyyy\u MM-dd-H-MM\u ss
,但这似乎不是解决办法有很多方法可以做到这一点,这实际上取决于你的文件命名有多规范-是否总是有一些垃圾文本,然后是一年
如果你想得到更多量身定制的建议,再举10个不同的例子。以下是您发布的方法:
DateTime.TryParseExact(
Path.GetFileNameWithoutExtension(b.DisplayName.Substring(b.DisplayName.IndexOf('-')+1)),
"yyyy_MM_dd-H_mm_ss",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out dateVal
);
这使用只有一个参数(无长度)的子字符串删除第一个连字符后的所有内容,并使用GetFileName WithoutExtension删除.xml-这有效地将anythinghere-2000_01_01-00_00.xml
转换为2000_01_01-00_00_00
准备进行解析
我也可以选择.Remove(“句号的最后一个索引”)
类型,但它确实有点混乱,因为你必须减去连字符的起始索引等
MJWill关于在连字符上拆分的评论也是很好的-您可以先拆分,然后获取[1]
和[2]
索引,然后连接在一起进行解析
最后,不要忘记,文件本身可能有一个创建日期,而不是文件名(可能会被人弄坏),只要它没有被传输到某个地方并重新保存,它可能已经是一个很好的候选创建日期。查看该属性的FileInfo.CreationTime
属性-我建议您使用正则表达式
,假设您的文件名始终遵循相同的格式,您可以执行以下操作:
var pattern = @"\d{4}_\d{2}_\d{2}-\d{2}_\d{2}_\d{2}";
var fileName = "test-2000_01_02-10_12_14.xml";
var match = new Regex(pattern);
var result = match.Match(fileName);
if (result.Success)
{
DateTime.TryParseExact(result.Value,
"yyyy_MM_dd-HH_mm_ss",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out DateTime dateVal);
}
首先,我们必须从文件名中提取(匹配)日期时间部分:
using System.Text.RegularExpressions;
...
// Aggravated task: dots and minuses within file's name
string source = @"bla-bla-bla-test.me-2000_01_02-10_12_14.xml";
string datetime = Regex.Match(
Path.GetFileNameWithoutExtension(source),
"[0-9]{4}_[0-9]{2}_[0-9]{2}-[0-9]{2}_[0-9]{2}_[0-9]{2}$").Value;
然后我们可以解析它
if (DateTime.TryParseExact(
datetime,
"yyyy_MM_dd-H_m_s",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out DateTime result) {
// result is the parsed date
}
else {
// File doesn't contain valid date and time
}
什么是b.DisplayName
?你能在-
上拆分字符串吗?“但它似乎不是解决方案”不是对问题的技术(或专业)描述,请粘贴错误消息或描述发生了什么(为了好玩,级别100),总之,将所有这些放在一边,然后使用regex@mjwillsb.显示名称为“test-2000\U 01\U 02-10\U 12\U 14”它总是测试…
还是可以用其他字符开头?@一般没有错误消息。解析接收值“false”。在本例中,我假设'*-yyyy_MM_dd-H_MM_ss'中的'*'不替换“test”
if (DateTime.TryParseExact(
datetime,
"yyyy_MM_dd-H_m_s",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out DateTime result) {
// result is the parsed date
}
else {
// File doesn't contain valid date and time
}