【问题标题】:DateTime.TryParseExact() rejecting valid formatsDateTime.TryParseExact() 拒绝有效格式
【发布时间】:2012-08-13 13:19:19
【问题描述】:

我正在解析 ASP.NET WebForms 页面中的 DateTime 值,并且日期字符串不断被 DateTime.TryParseExact() 方法拒绝,即使它明显匹配提供的格式字符串之一。

它似乎在我在家的开发机器上失败,但在生产服务器上工作,所以我正在考虑涉及本地日期设置,但即使我提供 IFormatProvider (CultureInfo) 对象作为参数也会出现此错误

代码如下:

DateTime startDate;
string[] formats = { "dd/MM/yyyy", "dd/M/yyyy", "d/M/yyyy", "d/MM/yyyy",
                    "dd/MM/yy", "dd/M/yy", "d/M/yy", "d/MM/yy"};

var errStart = row.FindControl("errStartDate"); //my date format error message
if (!DateTime.TryParseExact(txtStartDate.Text, formats, null, DateTimeStyles.None, out startDate))
{
    errStart.Visible = true; //we get here even with a string like "20/08/2012"
    return false;
}
else
{
    errStart.Visible = false;
}

注意我在上面给出了一个null FormatProvider但是当我提供一个CultureInfo 对象时会出现同样的问题 (CultureInfo provider = new CultureInfo("en-US")) 这个参数。

我错过了什么?

【问题讨论】:

  • 在美国文化中,日期格式是 m/d/y 而不是 d/m/y
  • 即使没有提到 FormatProvider,这段代码对我来说似乎也能正常工作。尝试指定 InvariantCulture。

标签: c# .net cultureinfo


【解决方案1】:

试试:

 DateTime.TryParseExact(txtStartDate.Text, formats, 
        System.Globalization.CultureInfo.InvariantCulture,
        System.Globalization.DateTimeStyles.None, out startDate)

【讨论】:

    【解决方案2】:

    这是简单的方法,使用 ParseExact

    CultureInfo provider = CultureInfo.InvariantCulture;
    DateTime result;
    String dateString = "Sun 08 Jun 2013 8:30 AM -06:00";
    String format = "ddd dd MMM yyyy h:mm tt zzz";
    result = DateTime.ParseExact(dateString, format, provider);
    

    这应该适合你。

    【讨论】:

      【解决方案3】:

      在这里您可以检查几件事。

      1. 您正确使用的日期格式。您可以为DateTime.TryParseExact 提供多种格式。查看完整的格式列表,可用here
      2. CultureInfo.InvariantCulture 更有可能添加问题。因此,不要传递NULL 将其设置为CultureInfo provider = new CultureInfo("en-US"),您可以这样写。 .

        if (!DateTime.TryParseExact(txtStartDate.Text, formats, 
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.DateTimeStyles.None, out startDate))
        {
            //your condition fail code goes here
            return false;
        }
        else
        {
            //success code
        }
        

      【讨论】:

        【解决方案4】:
        string DemoLimit = "02/28/2018";
         string pattern = "MM/dd/yyyy";
         CultureInfo enUS = new CultureInfo("en-US"); 
         DateTime.TryParseExact(DemoLimit, pattern, enUS, 
                             DateTimeStyles.AdjustToUniversal, out datelimit);
        

        了解更多https://msdn.microsoft.com/en-us/library/ms131044(v=vs.110).aspx

        【讨论】:

          【解决方案5】:

          试试 C# 7.0

          var Dob= DateTime.TryParseExact(s: YourDateString,format: "yyyyMMdd",provider: null,style: 0,out var dt)
           ? dt : DateTime.Parse("1800-01-01");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-15
            • 1970-01-01
            • 1970-01-01
            • 2018-10-27
            相关资源
            最近更新 更多