从文件名获取日期时间
Get DateTime from FileName
我有一个名为 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
但它似乎不是解决方案
有很多方法可以做到这一点,这实际上取决于文件命名的规律性 - 是否总是有一些垃圾文本后跟大肆宣传,然后是年份?
Post 如果您需要更多量身定制的建议,请再举 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
进入 2000_01_01-00_00_00
准备解析
我也可以选择 .Remove("last index of period")
类型的东西,但它确实有点乱,因为你必须减去连字符等的起始索引
MJWill 关于拆分连字符的评论也是一个很好的评论 - 您可以拆分然后获取 [1]
和 [2]
索引并连接然后重新组合在一起进行解析..
最后不要忘记文件本身可能有一个创建日期,它已经是创建日期的一个很好的候选者,而不是文件名(可能被人为破坏),只要它还没有被传送到某处并 re-saved。看看 FileInfo.CreationTime
属性 - https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=netframework-4.8
我建议您使用 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);
}
首先,我们必须提取(匹配)文件名中的日期时间部分:
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
}
我有一个名为 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
但它似乎不是解决方案
有很多方法可以做到这一点,这实际上取决于文件命名的规律性 - 是否总是有一些垃圾文本后跟大肆宣传,然后是年份?
Post 如果您需要更多量身定制的建议,请再举 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
进入 2000_01_01-00_00_00
准备解析
我也可以选择 .Remove("last index of period")
类型的东西,但它确实有点乱,因为你必须减去连字符等的起始索引
MJWill 关于拆分连字符的评论也是一个很好的评论 - 您可以拆分然后获取 [1]
和 [2]
索引并连接然后重新组合在一起进行解析..
最后不要忘记文件本身可能有一个创建日期,它已经是创建日期的一个很好的候选者,而不是文件名(可能被人为破坏),只要它还没有被传送到某处并 re-saved。看看 FileInfo.CreationTime
属性 - https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=netframework-4.8
我建议您使用 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);
}
首先,我们必须提取(匹配)文件名中的日期时间部分:
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
}