文字列は有効なDateTime“形式dd / MM / yyyy”として認識されませんでした


172

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

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

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

何が問題ですか ?これには、を要求する2番目のオーバーライドがありますIFormatProvider。これは何ですか?ください私はまた、これに合格する必要がありますか?はいの場合、このケースでどのように使用しますか?

編集する

違いは何ですかParseとはParseExact

編集2

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

タイプの安全、パフォーマンス、またはあなたが感じているものなどのすべての側面を考慮した方が良い答えはどれですか


7
@編集:それがドキュメントの目的です。 msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks

2
ParseExactは、日付文字列の正確な形式がわかっている場合に使用し、Parseは、もう少し動的なものを処理できるものが必要な場合に使用します。
gingerbreadboy

回答:


255

を使用しDateTime.ParseExactます。

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

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

8
ここでnullを渡さなければならないのはなぜですか?
Shantanu Gupta

3
「22/11/2009 12:00:00 AM」または「22/11/2009」を入力できます。また、開発マシンの文化は、生産の文化とは異なる場合があります。では、上記のコードはシームレスに機能しますか?
Rahatur、2012

8
@Rahat、形式が一致しない場合、正確な解析は機能しません。上記のフォーマットパターンはdd/MM/yyyy、時間が含まれているテキスト文字列が正しく解析されないためです。時間を取り除くか、フォーマットパターンに含める必要があります。ParseExactフォーマットパターンの配列を受け入れるオーバーロードがあり、いずれかに一致する場合にテキストを解析します。
サミュエルネフ

7
@SamuelNeff CultureInfo.InvariantCultureとにかくフォーマットを定義している場合は、現在のものの代わりに使用しないのはなぜですか?
Alvin Wong

3
@Toolkitこれは、フォーマット文字列内のスラッシュがリテラルスラッシュではないためです。現在のカルチャでは、日付区切り文字列に置き換えられます。したがって、上記のように文化に依存します。サミュエルネフ、試してみてくださいThread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");、それはあなたの解決策を壊します。これを修正するには、"dd'/'MM'/'yyyy"(スラッシュを単一引用符で保護する)または@"dd\/MM\/yyyy"(バックスラッシュでスラッシュを「エスケープ」する)を使用します。
Jeppe Stig Nielsen

44

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

例えば:

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

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


2
@Slaks:CultureInfo.InvariantCultureはコードでは使用できません。私はいくつかの名前空間を使用する必要がありますか
シャンタヌ・グプタ

3
using System.Globalization;
10

2
エラーを右クリックして[解決]をクリックすると、不足しているネームスペースが表示されます。
インキー2014年

エラーをダブルクリックして、使用可能な関連する名前空間を示す下矢印を表示することもできます
Usman Younas

スペースもカウントされるので、たとえば、文字列形式が「MM / dd / yyyy HH:mm:ss」である場合(注-2つのスペース)-ParseExactのフォーマットにはスペースも含める必要があります
Chris Halcrow

20

異なるカルチャには異なる日付形式があるため、DateTimeの文字列表現の解析は難しい作業です。.Netはこれらの日付形式を認識し、System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat呼び出し時に現在のカルチャ()からそれらを引き出しますDateTime.Parse(this.Text)

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

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

たとえば、これは日付を正しく解析します。

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

もちろん、ランダムにフランスを選ぶのではなく、ニーズに合ったものを選んでください。

あなたが理解する必要があるのは、何System.Threading.Thread.CurrentThread.CurrentCultureに設定されているか、そしてそれがあなたが期待するものと異なるかどうか/理由です。


あなたの解決策は私にとってうまくいきません。「文字列は有効なDateTimeとして認識されませんでした」のようなエラーを出します。そして、私は次の入力日付を渡します:「13/06/17」をソリューションに渡しますが、エラーが発生します。Plzが私を助けます。
Ghanshyam Lakhani 2017

16

上記の解決策は効果的ですが、以下を使用してwebconfigファイルを変更することもできます...

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

参照:ローカルマシンと本番マシンで異なる日時形式


1
アミット・フィリップス、あなたは私の日を救った。私はすべての可能なことを試みた。そして、この小さな変更が機能します。ありがとう。
RNH 2013

1
アミット、あなたは本当に神の息子です。
Furious Bear


4

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

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

3

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

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

3

この参照に基づいて、次のアプローチが私にとってうまくいきました:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);

2
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;
}

1

上記の誰かが言ったように、文字列パラメーターとして送信できますが、たとえば「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がそれを変換してデータベースに入れることができるようにします。


0

あなたも使うことができます

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

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

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

名前空間

using System.Globalization;

-6

手動で変更:

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

2015年12月22日から2015年11月22日に変換されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.