web-dev-qa-db-ja.com

文字列が有効なDateTime "format dd / MM / yyyy"として認識されませんでした

文字列形式の値をdd/MM/yyyy形式の日付型に変換しようとしています。

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);

何が問題ですか ? IFormatProviderを要求する2番目のオーバーライドがあります。これは何ですか? これも渡す必要がありますか?もしそうであれば、このケースでそれを使用する方法?

編集

ParseParseExactの違いは何ですか?

編集2

SlaksとSamの両方の答えが私のために働いています、現在ユーザーは入力をしていますが、これはそれらがmaskTextboxを使用することによって有効であることを私は保証するでしょう。

どちらの答えが、タイプの安全性、パフォーマンス、または自分が好むかなど、あらゆる側面を考慮した方が良い

151
Shantanu Gupta

DateTime.ParseExactを使用してください。

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
226
Samuel Neff

ParseExact を呼び出す必要があります。これは、指定した形式と正確に一致する日付を解析します。

例えば:

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

IFormatProviderパラメーターは、日付を解析するために使用するカルチャを指定します。
あなたの文字列がユーザから来ていない限り、あなたはCultureInfo.InvariantCultureを渡すべきです。
文字列がユーザーからのものである場合は、ユーザーがコントロールパネルの[地域のオプション]で指定した設定を使用するCultureInfo.CurrentCultureを渡す必要があります。

41
SLaks

DateTimeの文字列表現を解析するのは難しいことです。文化が異なると日付形式も異なるからです。 .Netはこれらの日付フォーマットを認識しており、DateTime.Parse(this.Text)を呼び出すと現在のカルチャ(System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat)からそれらを取り出します。

たとえば、文字列 "22/11/2009"は米国の ShortDatePattern には一致しませんが、フランスには一致します。 (fr-FR).

さて、あなたはDateTime.ParseExactを呼び出してあなたが期待している正確なフォーマット文字列を渡すことができます、あるいは日付を解析するためにDateTime.Parseに適切なカルチャを渡すことができます。

例えば、これはあなたの日付を正しく解析します:

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

もちろん、フランスを無作為に選ぶのではなく、ニーズに合ったものを選ぶべきです。

把握する必要があるのは、System.Threading.Thread.CurrentThread.CurrentCultureが何に設定されているか、そしてそれがあなたの予想と異なるかどうか、またその理由です。

20
Greg

上記の解決策は効果的ですが、次のようにwebconfigファイルを変更することもできます。

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>

参照: ローカルマシンではプロダクションマシンと比較して日時形式が異なります

15
Amit Philips

次のように、その特定の日付形式のカルチャを指定する必要があるかもしれません。

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy

    this.Text="22/11/2009";

    DateTime date = DateTime.Parse(this.Text);

詳細についてはここに行きます:

http://msdn.Microsoft.com/ja-jp/library/5hh873ya.aspx

10
Ricardo Sanchez

this reference に基づいて、次のアプローチは私にとって役に立ちました:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
3
Jesús Castro
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}
2
Bala Kumar

多くの時間を費やした後、私は問題を解決しました

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
2
atik sarker

これを使用して文字列を日時に変換します。

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
2
AshifJM

上の誰かがあなたが文字列パラメータとしてそれを送ることができると言ったように、それはこのフォーマットを持っていなければなりません:例えば '20130121'そしてあなたはコントロールから直接それを取ってそのフォーマットにそれを変換できます。それで、あなたはそれを例えば次のようなテキストボックスから得るでしょう:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

それをに変換するには: '20130121'あなたが使用:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

sQLが変換してデータベースに格納できるようにします。

1
G Jeny Ramirez

外部参照なしの簡単な方法:

public string FormatDate(string date, string format)
{
   try {
      return DateTime.Parse(date).ToString(format);
   }
   catch (FormatException) 
   {
      return string.Empty;
   }
}
0
David Castro

コードの下で私のために働きました:

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

ネームスペース

using System.Globalization;
0
Anjan Kant

あなたも使えます

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day
0