从文件名获取日期时间

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
  }