2017-03-10 11 views
1

開発サーバーではなくテストサーバーでクラッシュするコードがあります。私は開発者とテストのための2つのWindows 2012R2サーバーを持っています。どちらも同じパッチレベルで、同じ.NET FrameWorkバージョン。現在のユーザーとシステムローカルの両方で同じ地域設定(オランダ語)を持っています。このオランダの設定には、日付セパレータとして - があります。次のコードスニペットは、devサーバー上で動作しますが、テストサーバーでクラッシュします。私はコンソールアプリケーションで2行のコードでスニペットを追加し、エラーを再現することができます。DateTime ParseExact他のサーバーでの動作が異なります

(デモコンソールアプリケーションのために簡略化)コードの一部です:

 string date = "28/02/2017"; 
     DateTime dateDate = DateTime.ParseExact(date, "dd/MM/yyyy", null); 

だから、これは私が変更した場合、私は

Unhandled Exception: System.FormatException: String was not recognized as a vali 
d DateTime. 
    at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInf 
o dtfi, DateTimeStyles style) 
    at System.DateTime.ParseExact(String s, String format, IFormatProvider provid 
er) 

この例外を取得し、私のdevのサーバー上で動作し、テスト に墜落しましたコードへの

 string date = "28/02/2017"; 
     DateTime dateDate = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture); 

両方のサーバーで動作します。コンソールアプリケーションでCurrentCultueとCurrentUiCultureを出力すると、両方のサーバーで同じです。

私のテストサーバーで何が問題になるのでしょうか? ParseExactメソッドでnullを渡すと、CurrentCultureを使用して日付分離器/エラーが発生するはずであるため、コードが自分のdevserverでもクラッシュすることが予想されます。

よろしく ダニー

+0

*テストサーバー上のクラッシュ*それは何を意味するのでしょうか?どのような例外がありますか? – DavidG

+0

とにかく日付を解析するためのカルチャを指定する必要があります – slawekwin

答えて

0

nullあなたがCultureInfo.InvariantCultureを渡すとは反対に、代わりに現在の培養を使用することを指定します。

MSDN

プロバイダがnull場合、 現在の培養に対応CultureInfoオブジェクトが使用されます。

/は、datetimesを解析する際に特別な意味を持ちます。彼らは、真っ直ぐな文化のDateSeparatorに置き換えられます。 (The "/" custom format specifier)

また、それらをマスクすることができます:

DateTime dateDate = DateTime.ParseExact(date, "dd'/'MM'/'yyyy", null); 
+0

これは本当に動作します。しかし、どうすれば私の最初のサーバーでは ''なしで動作し、2番目のサーバーでは同じ設定のcultureを持っていても例外が発生する可能性はありますか? – Danny

+0

@ダニー:私は分かりません。あなたがそうであっても、テストが異なっていたか、文化の設定が同じではなかった。コンピュータの地域設定を見てください。 https://blogs.technet.microsoft。com/askperf/2012/08/16 /地域の設定を変更する方法 - すべてのユーザーのコンピュータ/ –

+0

DateTimeを実行するときに "dd/MM/yyyy"の形式を渡すと/の文字列には特別な意味はありませんか?それはうまく動作します。 – Danny

0

/文字が日付フォーマット文字列では文字通りに解釈されていません。使用されている書式プロバイダに応じて日付区切りに置き換えられます。

あなたはそれフォーマット文字列で文字リテラルにするために、単一引用符で/を囲む必要があります。

"dd'/'MM'/'yyyy" 
関連する問題