假设文件名将始终包含嵌入其中的日期,但它不会是统一的,有没有办法解析这样的文件并一致地将文件名转换为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” -和: “NNNNN.YYYY-DD-MM.zsj”
- IOW,文件名总是包含以某种方式表示的日期,但除此之外,所有的赌注都是关闭的,有希望还是没有?
答案 0 :(得分:3)
不,除非你能将扩展名与已知格式匹配,否则没有希望。
有些日/月组合,你会很幸运,如2012-12-31。显然,31不是月份值,您可以至少推断出日/月/ 4位数年份组合。
正如阿列克谢提到的那样,2位数的年份使这个问题更加复杂化。
作为旁注,这非常类似于SQL Server问题。这是好的和花花公子,直到它以不同的日期时间格式预期运行:
SELECT CAST('2012-05-01' AS DATETIME)
根据区域设置,可能是2012年5月1日或2012年1月5日。 (见本帖:Error converting string to datetime due to locale)
答案 1 :(得分:2)
如果您允许使用YYYY-DD-MM和YYYY-MM-DD对或2位数,则不可能。
什么是10-11-12(YY-DD-MM,DD-MM-YY,......)?
答案 2 :(得分:1)
将字符串拆分为-
并循环显示列表。
如果你看到3个连续的数字,那么它可能会被击中。然后解析这些数字以获取日期。它不会捕获所有,但会捕获最多。
答案 3 :(得分: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);