格式为“ddd”的 DateTime.TryParseExact 在除当前日期之外的所有日期均失败

Art*_*dod 3 c# datetime date

我遇到了一个奇怪的问题。现在是星期三,并且:

DateTime date;
DateTime.TryParseExact(
   "Wed", "ddd", null, System.Globalization.DateTimeStyles.None, out date); // true

DateTime.TryParseExact(
   "Mon", "ddd", null, System.Globalization.DateTimeStyles.None, out date); // false
Run Code Online (Sandbox Code Playgroud)

当我将计算机上的本地日期更改为星期一时,输出交换为“假-真”。

为什么解析器依赖于当前日期?

Jon*_*eet 5

怀疑问题是你的日期格式非常不完整。通常,DateTime.TryParseExact将对任何未指定的字段使用当前时间和日期。在这里,您指定的是星期几,这实际上并没有足够的信息来获取真实的日期...所以我怀疑文本值仅用于验证是一个合理的日期,在默认之后DateTime到“现在”。(在它确实能够仅根据日期名称进行解析的情况下,您最终会得到今天的日期。)

我刚刚做了另一个测试,我们也指定了月份值,最终得到了有趣的结果 - 它似乎使用了当年的第一个月:

using System;
using System.Globalization;

class Test
{    
    public static void Main (string[] args)
    {
        // Note: All tests designed for 2015.
        // January 1st 2015 was a Thursday.
        TryParse("01 Wed"); // False
        TryParse("01 Thu"); // True - 2015-01-01
        TryParse("02 Thu"); // False
        TryParse("02 Fri"); // True - 2015-01-02
    }

    private static void TryParse(string text)
    {
        DateTime date;
        bool result = DateTime.TryParseExact(
            text, "dd ddd", CultureInfo.InvariantCulture, 0, out date);
        Console.WriteLine("{0}: {1} {2:yyyy-MM-dd}", text, result, date);
    }
}
Run Code Online (Sandbox Code Playgroud)

将系统日期更改为 2016 年得到的结果与 2016 年 1 月的查找日期一致。

从根本上说,试图解析如此不完整的内容本质上是奇怪的。仔细想想你真正想要实现的目标是什么。