1

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

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

“NNNNN.YYYY-MM-DD.log”

...这很容易。

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

“NNN.YYYY-MM-DD.log”或“NNNNN.YYYY-MM-DD.txt”或“NNNNNNN.YYYY-MM-DD.bunyan”——甚至可能:“NNNNN.MM-DD-YYYY。 xlw" -and: "NNNNN.YYYY-DD-MM.zsj"

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

4

4 回答 4

3

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

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

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

附带说明一下,这与 SQL Server 问题非常相似。在以不同的日期时间格式期望运行之前,这很好而且很花哨:

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

根据语言环境,这可能是 2012 年 5 月 1 日或 2012 年 1 月 5 日。(请参阅此线程:由于语言环境而将字符串转换为日期时间时出错

于 2012-06-01T23:43:05.480 回答
2

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

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

于 2012-06-01T23:43:13.063 回答
1

通过列表拆分字符串-并循环。如果您看到 3 个连续数字,则可能是命中。然后解析这些数字以获得日期。它不会捕获所有,但会捕获大部分。

于 2012-06-01T23:41:35.300 回答
1

你必须做出一些假设才能到达我认为的任何地方。您的所有示例都采用 NNN.SOMEDATEFORMAT.EXTENSION 格式。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);
于 2012-06-01T23:45:53.560 回答