文字列形式の値をdd/MM/yyyy
形式の日付型に変換しようとしています。
this.Text="22/11/2009";
DateTime date = DateTime.Parse(this.Text);
何が問題ですか ? IFormatProvider
を要求する2番目のオーバーライドがあります。これは何ですか? これも渡す必要がありますか?もしそうであれば、このケースでそれを使用する方法?
編集
Parse
とParseExact
の違いは何ですか?
編集2
SlaksとSamの両方の答えが私のために働いています、現在ユーザーは入力をしていますが、これはそれらがmaskTextboxを使用することによって有効であることを私は保証するでしょう。
どちらの答えが、タイプの安全性、パフォーマンス、または自分が好むかなど、あらゆる側面を考慮した方が良い
DateTime.ParseExact
を使用してください。
this.Text="22/11/2009";
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
ParseExact
を呼び出す必要があります。これは、指定した形式と正確に一致する日付を解析します。
例えば:
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
IFormatProvider
パラメーターは、日付を解析するために使用するカルチャを指定します。
あなたの文字列がユーザから来ていない限り、あなたはCultureInfo.InvariantCulture
を渡すべきです。
文字列がユーザーからのものである場合は、ユーザーがコントロールパネルの[地域のオプション]で指定した設定を使用するCultureInfo.CurrentCulture
を渡す必要があります。
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
が何に設定されているか、そしてそれがあなたの予想と異なるかどうか、またその理由です。
上記の解決策は効果的ですが、次のようにwebconfigファイルを変更することもできます。
<configuration>
<system.web>
<globalization culture="en-GB"/>
</system.web>
</configuration>
次のように、その特定の日付形式のカルチャを指定する必要があるかもしれません。
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy
this.Text="22/11/2009";
DateTime date = DateTime.Parse(this.Text);
詳細についてはここに行きます:
this reference に基づいて、次のアプローチは私にとって役に立ちました:
// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017"
var formatInfo = new DateTimeFormatInfo()
{
ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
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;
}
多くの時間を費やした後、私は問題を解決しました
string strDate = PreocessDate(data);
string[] dateString = strDate.Split('/');
DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
これを使用して文字列を日時に変換します。
Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
上の誰かがあなたが文字列パラメータとしてそれを送ることができると言ったように、それはこのフォーマットを持っていなければなりません:例えば '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が変換してデータベースに格納できるようにします。
外部参照なしの簡単な方法:
public string FormatDate(string date, string format)
{
try {
return DateTime.Parse(date).ToString(format);
}
catch (FormatException)
{
return string.Empty;
}
}
コードの下で私のために働きました:
DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));
ネームスペース
using System.Globalization;
あなたも使えます
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