C# DateTime.ParseExact在格式中包含反斜杠的用法

3

我有一些以日期命名的子目录,例如:

C:\SomeDirectory\201309\01
C:\SomeDirectory\201309\02
C:\SomeDirectory\201309\03
C:\SomeDirectory\201309\04
C:\SomeDirectory\201309\05

我想要做的是获取目录列表,然后使用Linq根据日期范围限制结果。

我已经这样使它工作:

string path = @"C:\SomeDirectory";
DateTime f = new DateTime(2013, 9, 1);
DateTime t = new DateTime(2013, 9, 3);
DateTime dt;
var dirs =
    Directory.GetDirectories(path, "*.*", SearchOption.AllDirectories)
             .Where(d => DateTime.TryParseExact(
                 d.Substring(Math.Max(0, d.Length - 9)).Replace("\\", null),
                 "yyyyMMdd",
                 CultureInfo.Invarient,
                 DateTimeStyles.None,
                 out dt)
                 && f <= dt
                 && dt <= t);

然而,我希望更改TryParseExact部分,以便我不必替换反斜杠 - 就像这样:

DateTime.TryParseExact(
    d.Substring(Math.Max(0, d.Length - 9)),
    @"yyyyMM\dd",
    CultureInfo.Invarient,
    DateTimeStyles.None,
    out dt)

但是,似乎TryParseExact不喜欢那种格式。我认为这可能与CultureInfo有关 - 但我无法找到可能帮助我处理反斜杠的解决方案。

非常感谢您的任何帮助!


1
你尝试过双反斜杠吗?反斜杠是DateTime格式化使用的特殊字符,我相信。更多信息请参见此处 - Adam Houldsworth
你也可以尝试使用反斜杠的字符值(在ASCII表中找到它)。 - NDraskovic
为什么不只在SomeDirectory下的单个目录中搜索?或者您可以先检查:Where(d=>d.Length==6 && d.All(Char.IsDigit)) - Tim Schmelter
@AdamHouldsworth 那是正确的解决方案 - MarcinJuraszek 在下面的答案中也指出了。谢谢。 - Sean Hosey
@TimSchmelter 可能我的日期范围会跨越多个月,我也希望得到这些结果。我应该在上面的示例中提及这种可能性。 - Sean Hosey
1个回答

8
根据MSDN上的自定义日期和时间格式字符串\是转义字符。所以在@"yyyyMM\dd"中,它从第一个d中删除了特殊含义。您应该转义\

要在结果字符串中包含反斜杠,必须使用另一个反斜杠进行转义(\\)。

所以请尝试以下内容:
DateTime.TryParseExact(
    d.Substring(Math.Max(0, d.Length - 9)),
    @"yyyyMM\\dd",
    CultureInfo.InvariantCulture,
    DateTimeStyles.None,
    out dt)

我其实是偶然间弄明白了 - 想着也许我需要转义它 - 然后按照你的建议去做了。我很快会将其标记为答案。谢谢 :) - Sean Hosey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接