【问题标题】:DateTime.TryParse with different culture具有不同文化的 DateTime.TryParse
【发布时间】:2021-10-20 01:44:01
【问题描述】:

我有两个日期如下所示,并且我的当地文化是“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 文化相同

所以想问一下这样做对不对?还是有其他办法?

【问题讨论】:

  • 不,你需要事先知道格式。例如,您如何知道01-02-2021 是 2 月 1 日还是 1 月 2 日?
  • 那么 01/02/2021 是第二个中的第一个还是第一个中的第二个?你这里有一个更大的问题
  • @DavidG 打败了我,日期完全相同!
  • 计算机不是魔法——唉,它猜不出意思。如果您有日期,则它们需要采用固定且定义明确的格式。
  • 或者您需要将格式(文化)与日期一起存储

标签: c# .net datetime cultureinfo invariantculture


【解决方案1】:

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

        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");

【讨论】:

  • 如果您没有足够的代表发表评论,那就去找一些代表。你只需要几个点,所以应该只需要几分钟。
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多