C# DateTime.TryParseExact()拒绝有效格式

C# DateTime.TryParseExact()拒绝有效格式,c#,.net,cultureinfo,C#,.net,Cultureinfo,我正在分析ASP.NET WebForms页面中的一个日期时间值,该日期字符串一直被DateTime.TryParseExact()方法拒绝,即使它与提供的格式字符串之一明显匹配 它似乎在我家的开发机器上失败了,但在生产服务器上工作,因此我考虑使用本地日期设置,但即使在我提供IFormatProvider(CultureInfo)对象作为参数时,也会发生此错误 代码如下: DateTime startDate; string[] formats = { "dd/MM/yyyy", "dd/M/y

我正在分析
ASP.NET WebForms
页面中的一个日期时间值,该日期字符串一直被
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”)
用于此参数

我错过了什么?

试试:

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

这是一个简单的方法,使用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);

这应该适合你。

在这里,你可以检查几件事

  • 正确使用的日期格式。您可以为
    DateTime.TryParseExact
    提供多种格式。检查完整的可用格式列表
  • CultureInfo.InvariantCulture
    哪个更有可能添加问题。因此,不必传递
    NULL
    或将其设置为
    CultureInfo provider=new CultureInfo(“en-US”)
    ,您可以这样编写它。

  • 要了解更多信息,请尝试C#7.0


    在美国文化中,日期格式是m/d/y而不是d/m/yEven,如果不提及FormatProvider,这段代码对我来说似乎很好。尝试指定不变量区域性。
    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
    }
    
    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);
    
    var Dob= DateTime.TryParseExact(s: YourDateString,format: "yyyyMMdd",provider: null,style: 0,out var dt)
     ? dt : DateTime.Parse("1800-01-01");