2011-08-04 12 views
0

Convert.ToDateTimeは、次の値に対して異常な動作をするのはなぜですか?Strange Convert.ToDateTimeの動作

次はうまく動作します:

var value = "08/01/2011"; 
var dateTime = Convert.ToDateTime(value); 

結果は次のとおりです。{08/01/2011 00:00:00} ---ちょうど期待されています。

しかし、私はこれを行う際に、今、:

var value = "07/21/2011"; 
var dateTime = Convert.ToDateTime(value); 

を私は例外を取得:

'Convert.ToDateTime("07/21/2011")' threw an exception of type 'System.FormatException'

+2

あなたの地域設定は、おそらく/ MM/YYYY – Koen

+0

@Koen ddをしていますか? – Moon

答えて

4
"07/21/2011"; 

21のように解釈されますので、これは、有効な日付ではありません月。

ではなく、形式を指定明示的にしてみてください。

DateTime myDate = DateTime.ParseExact("07/21/2011", "MM/dd/yyyy", 
             CultureInfo.InvariantCulture); 

は編集:@のDTBさんのコメントに同意した

- 私はちょうどあなたが指定した日付が合法である文化を見つけることができませんでした。しかし、一般的な形式は次のとおりです。XXX使用したい文化の名前です

DateTime myDate = Convert.ToDateTime("07/21/2011", new CultureInfo("XXX")) 

(すなわち「-GBエン」 - しかし、この形式では動作しません)

+1

Better:入力がフォーマットされることを期待している文化を明示してください。 – dtb

+0

@dtb:文化情報はどのように入手できますか? – Moon

+0

@Ruby:これは通常、国固有のものです。これを使用したいシステムはどこですか? – BrokenGlass

1

日付/時刻文字列は、現在のスレッドのカルチャ設定(Windowsのコントロールパネルで設定された地域設定によって決まります)に従って解析されます。現在の培養は、EN-GBFR-FR又はである場合、例えば

は、その後、入力がday/month/year形式で期待されています。現在のカルチャが、en-USの場合、入力はmonth/day/yearの形式になります。

Thread.CultureInfo propertyThread.CurrentThreadを見て、現在のスレッドのカルチャ設定を見つけることができます。

現在のスレッドのカルチャ設定に従って日付/時刻文字列を解析しない場合は、カルチャ設定を明示的に指定する必要があります。お使いのシステムは、EN-GBFR-FRまたはとして設定しているように見える一方で

あなたの入力は、でEN-US形式のようです。だから、明示的文化としてEN-USを指定:121とは異なり、有効な月であるため、

DateTime result = DateTime.Parse("07/21/2011", new CultureInfo("en-US")); 
// result.Day == 21 
// result.Month == 7 
// result.Year == 2011 

あなたの最初の例が動作する理由、です。どのように私はその後、私の地域設定をチェックしますし、それに応じて私の文字列値を書式:日付の

DateTime result = DateTime.Parse("08/01/2011", new CultureInfo("fr-FR")); 
// result.Day == 8 
// result.Month == 1 
// result.Year == 2011