web-dev-qa-db-ja.com

DateTime.TryParseExact()は有効な形式を拒否します

_ASP.NET WebForms_ページのDateTime値を解析していますが、日付文字列は、指定された形式文字列の1つと明確に一致していても、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"))_。

私は何が欠けていますか?

54
see sharper

試してください:

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

ここでは、いくつかのことを確認できます。

  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
    }
    _
8
Amnesh Goel

これはシンプルなメソッドで、ParseExactを使用します

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

これはあなたのために働くはずです。

6
Jidheesh Rajan

C#7.0をお試しください

var Dob= DateTime.TryParseExact(s: YourDateString,format: "yyyyMMdd",provider: null,style: 0,out var dt)
 ? dt : DateTime.Parse("1800-01-01");
2
Waleed A.K.
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

1
islam elgaidi