我有一个名为test-2000_01_02-10_12_14.xml
的文件。
如何仅从文件中获取日期?
如果文件具有以下名称,我可以获取日期:2000_01_02-10_12_14
(b
是StorageFile
):
DateTime dateVal;
bool parsed = DateTime.TryParseExact(b.DisplayName,
"yyyy_MM_dd-H_mm_ss",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out dateVal);
然后我尝试将yyyy_MM_dd-H_mm_ss
更改为类似*-yyyy_MM-dd-H-mm_ss
的名称,但这似乎不是解决方案
答案 0 :(得分:2)
有很多方法可以做到这一点,它实际上取决于文件命名的频率-是否总是出现一些垃圾文本,然后大肆宣传,然后是年份?
如果您需要更多量身定制的建议,请发布另外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
);
这将使用仅带一个参数(无长度)的Substring删除第一个连字符之后到字符串末尾的所有内容,并使用GetFileNameWithoutExtension删除.xml-这实际上将anythinghere-2000_01_01-00_00_00.xml
变成了{{1} }准备进行解析
我也可以尝试使用2000_01_01-00_00_00
类型的东西,但是它确实有点混乱,因为您必须减去连字符的起始索引,等等
MJWill关于连字符分割的评论也是一个很好的评论-您可以分割然后采用.Remove("last index of period")
和[1]
索引,然后再联接在一起以进行解析。
最后不要忘记,文件本身可能已经创建了一个日期,而不是文件名(可能被人弄乱了),只要它没有被传送到某个地方,它就已经是创建日期的良好候选者。然后重新保存看看它的[2]
属性-https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=netframework-4.8
答案 1 :(得分:1)
首先,我们必须从文件名中提取(匹配)日期时间部分:
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
}
答案 2 :(得分:0)
我建议您使用regular expression
,前提是您的文件名始终采用相同的格式,您可以执行以下操作:
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);
}