77

我正在解析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"))这个参数时会出现同样的问题。

我错过了什么?

4

5 回答 5

127

尝试:

 DateTime.TryParseExact(txtStartDate.Text, formats, 
        System.Globalization.CultureInfo.InvariantCulture,
        System.Globalization.DateTimeStyles.None, out startDate)
于 2012-08-17T04:49:19.210 回答
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
    }
    
于 2015-09-19T14:33:16.963 回答
7

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

这应该适合你。

于 2013-10-08T04:52:29.173 回答
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");
于 2018-04-20T22:11:52.907 回答
2
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

于 2018-02-05T17:52:00.590 回答