当文件名有点“自由格式”时,有没有办法一致地将文件名转换为日期时间值

本文关键字:文件名 时间 日期 转换 有没有 自由 格式 自由格式 | 更新日期: 2023-09-27 18:36:14

>假设文件名将始终包含嵌入其中的日期,但它不会统一,有没有办法解析这样的文件名并始终如一地将文件名转换为日期时间?

更具体地说,如果文件名始终具有相同的格式,例如:

"呵呵。年-月-日.log"

。这很容易。

但是,如果文件名可以采用以下任何格式:

"NNN。YYYY-MM-DD.log" 或"呵呵。YYYY-MM-DD.txt" 或"nnnnnnn。年-月-日.班扬"——甚至可能:"呵呵。MM-DD-YYYY.xlw"-和:"呵呵。YYYY-DD-MM.zsj"

- IOW,文件名总是包含以某种方式表示的日期,但除此之外,所有的赌注都关闭了,有希望还是没有?

当文件名有点“自由格式”时,有没有办法一致地将文件名转换为日期时间值

不,除非你能将扩展名匹配到已知格式,否则没有希望。

有些日/月组合你会很幸运,比如 2012-12-31。 显然,31 不是月份值,您至少可以推断出日/月/4 位数的年份组合。

正如阿列克谢所提到的,2位数的年份使问题进一步复杂化。

作为旁注,这与SQL Server问题非常相似。 这很好,很花花公子,直到它以不同的日期时间格式期望运行:

SELECT CAST('2012-05-01' AS DATETIME)

根据区域设置,这可能是 2012 年 5 月 1 日或 2012 年 1 月 5 日。(请参阅此线程:由于区域设置,将字符串转换为日期时间时出错)

不,如果您允许 YYYY-DD-MM 和 YYYY-MM-DD 对或 2 位数字表示年份,则是不可能的。

什么是 10-11-12 (YY-DD-MM, DD-MM-YY,....)?

-拆分字符串并循环访问列表。如果您看到 3 个连续的数字,那么它可能命中。然后解析这些数字以获取日期。它不会抓住所有人,但会抓住大部分。

你必须做出一些假设才能到达我认为的任何地方。您的所有示例都采用 NNN 格式。某种日期格式。外延。DateTime.Parse 足够聪明,可以处理大多数(所有?)有效的日期/时间格式。试试这个;

string path = "123.2001-01-01.log";
string filename = Path.GetFileNameWithoutExtension(path);
int indexFirstSeparator = filename.IndexOf('.') + 1;
string datepart = filename.Substring(indexFirstSeparator);
DateTime dt = DateTime.Parse(datepart);