首页 > 解决方案 > 具有不同文化的 DateTime.TryParse

问题描述

我有两个日期如下,并且我的当地文化是“en-IN”

string enInDateValue = "13-12-2021 12:00:00"; // dd/mm/yyyy
string enUSDateValue = "12-13-2021 12:00:00"; // mm/dd/yyyy

如果我使用 Invariant Culture 运行以下代码,则日期将使用 enUSDate 进行解析。

DateTime.TryParse(enInDateValue, CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out result)
DateTime.TryParse(enUSDateValue, CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out result)

要解决以下问题是我正在使用的代码,它正在解析每种文化的日期。

public static bool DateTimeTryParse(string date, out DateTime result)
    {
        return (
            DateTime.TryParse(date, CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault, out result) ||
              DateTime.TryParse(date, CultureInfo.CurrentCulture, DateTimeStyles.NoCurrentDateDefault, out result) ||
              DateTime.TryParse(date, CultureInfo.CurrentUICulture, DateTimeStyles.NoCurrentDateDefault, out result)
        );
    }

如果它仅因不变文化而失败,它将转到当前并且对于 UI 文化相同

所以想问一下这样做是否合适?或者有没有其他办法?

标签: c#.netdatetimecultureinfoinvariantculture

解决方案


您需要明确指定预期的格式。这个小样本可能会有所帮助:

        string date1 = "12-13-2021";
        string date2 = "13-12-2021";

        string format1 = "MM-dd-yyyy";
        string format2 = "dd-MM-yyyy";

        DateTime parsedDate1, parsedDate2;

        bool success1 = DateTime.TryParseExact(date1, format1, null, DateTimeStyles.None, out parsedDate1);
        bool success2 = DateTime.TryParseExact(date2, format2, null, DateTimeStyles.None, out parsedDate2);

        if (success1)
            Console.WriteLine($"First date parsed successfully: {parsedDate1.ToString("yyyy,MMM,dd,ddd")}");
        else
            Console.WriteLine("First date failed to parse");

        if (success2)
            Console.WriteLine($"Second date parsed successfully: {parsedDate2.ToString("yyyy,MMM,dd,ddd")}");
        else
            Console.WriteLine("Second date failed to parse");

推荐阅读