有没有一种方法,以一个文件名一致转换为datetime值时,文件名是有点“自由形式”?(Is the

2019-10-16 19:03发布

假设文件名总是包含嵌入在其中的日期,但它不会是统一的,是有办法来分析这样的和一致的文件名转换成一个DateTime?

更具体地说,如果文件名总是具有相同的格式,如:

“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,文件名总是包含以某种方式表示的日期,否则,所有的赌注都关闭,有希望,还是没了?

Answer 1:

没有,有没有希望,除非你可以匹配扩展到一个已知的格式。

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

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

作为一个方面说明,这是非常类似于SQL Server的问题。 直到它与不同的日期时间格式的预期运行,这是罚款和花花公子:

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

根据不同的区域,这可能是2012年5月1年或2012年1月5日,(请参阅本主题: 错误将字符串转换为datetime由于语言环境 )



Answer 2:

不,如果你允许一年YYYY-MM-DD和YYYY-MM-DD对或2位数字是不可能的。

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



Answer 3:

拆分字符串的-通过列表和循环。 如果你看到连续的3个数字,那么它是一个可能的命中。 然后分析这些数字获得一个约会。 它不会捕获所有,但会抓住最。



Answer 4:

你必须作出一些假设取得任何进展,我认为。 你所有的例子都在格式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);


文章来源: Is there a way to consistently convert a filename into a datetime value when the filename is somewhat “free form”?