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
  }