从FileName获取DateTime

时间:2019-06-11 08:42:44

标签: c# file datetime tryparse

我有一个名为test-2000_01_02-10_12_14.xml的文件。

如何仅从文件中获取日期?

如果文件具有以下名称,我可以获取日期:2000_01_02-10_12_14

bStorageFile):

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的名称,但这似乎不是解决方案

3 个答案:

答案 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);
}