DateTime.TryParseExact()拒绝有效格式


71

我正在解析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在上面给出了a ,但是当我为该参数提供CultureInfo对象 时,也会出现相同的问题(CultureInfo provider = new CultureInfo("en-US"))

我想念什么?


3
在美国文化中,日期格式是m / d / y而不是d / m / y
StuartLC'Aug

1
即使不提及FormatProvider,此代码对我来说似乎也很好用。尝试指定InvariantCulture。
丹麦

Answers:



8

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

  1. 您正确使用的日期格式。您可以为提供多种格式DateTime.TryParseExact。检查格式的完整列表,可从此处获得
  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
    }
    

6

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

试试C#7.0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.