新しいサーバー上の .NET グローバル カルチャー
-
19-09-2019 - |
質問
新しいサーバーに移動したばかりで、すべてが順調に進んでいます。ただし、以前、「dd/mm/yyyy」形式の文字列を日付に変換しようとしたときに .NET エラーが発生しました。今はローカルの web.config でカルチャ設定を変更しましたが、これをグローバルにする必要があります。 。
これはどこで変更すればよいのでしょうか?machine.config を想定しましたが、古いサーバーでは見慣れた設定が見つかりませんでした。
それともサーバー側を見て、マシン上のカルチャを en-GB に設定する設定を見つけるべきでしょうか?
== update ==地域設定を変更しましたが、残念ながら失敗します。machine.config のグローバル設定が問題を引き起こしている可能性がありますか?現時点では、invariant を使用していて失敗しているようです。
私は Windows Server 2008 と IIS7 を使用していますが、少しでも役に立てれば幸いです。
この日は 1 回限りのサイトの登録フォームの締め切り日であるため、使用されている文字列はページにハードコードされています。
実行されるコードは次のとおりです。
if (DateTime.Now > Convert.ToDateTime("26/04/2008 12:00"))
非常に単純で、これまでに何百万回も動作しましたが、このエラーが発生するのは、この新しいセットアップでのみです。
解決 2
は、最後に(と私は、これはそれをやってかないの最善の方法だったのかはわからない)私は、IIS7内からコンピュータを選択し、エンGBにそこグローバリゼーション設定を設定する必要がありました。これは、問題を解決しましたし、指定されない限り、また、その文化の中で、将来的にすべての私の他のウェブサイトを維持します。
私はすでに、英国へのコンピュータに地域設定を変更していたし、それが問題を解決していないことに注意してください。
しかし私は、今から1は、として日付を解析するために文化を指定するアルフレッドの提案を進めて行きます。
他のヒント
サーバーを移行するときは、可能であれば、以前と同じ地域設定 (コントロール パネル) を使用することをお勧めします。そうするだけで、多くの問題を回避できます。
ただし、新しいサーバーが他の地域設定を必要とする他のアプリケーションをホストする場合、または新しいポリシーのためにその設定が必要な場合は、それが不可能な場合があります。
いずれの場合も、すべての Parse および ToString() 呼び出し中に、該当する場合には形式を明示的に指定することがベスト プラクティスです。
そのための FxCop (および静的分析) ルールもあります。
質問に関する新しい情報を反映するために更新されました:
Convert.ToDateTime は「便利な」メソッドで、次のように実装されます。
public static DateTime ToDateTime(string value)
{
if (value == null)
{
return new DateTime(0L);
}
return DateTime.Parse(value, CultureInfo.CurrentCulture);
}
DateTime.Parse を呼び出して明示的な CultureInfo (CultureInfo.CurrentCulture) を渡すことに注意してください。
CultureInfo.CurrentCulture は Thread.CurrentThread.CurrentCulture から値を取得します。
CultureInfo.CurrentCulture を見て、実際にどの CultureInfo が返されているかを確認したり、さらに調査して何が起こっているのかを理解することもできますが、その一方で、次のことをお勧めします。 明示的に指定する 文字列を DateTime や Double などの他のデータ型に解析するときに使用されるフォーマッタ。
元の回答で述べたように、インスタンスを受け取るオーバーロードを持つメソッドに IFormatProvider が渡されていないかどうかをチェックする FxCop (静的分析) ルールがあります。 CA1305.
したがって、コードを次のように書き直すことをお勧めします。
if (DateTime.Now > DateTime.Parse("26/04/2008 12:00", new CultureInfo("en-GB")))
文字列を日付に変換するときは常に、使用するカルチャを指定する必要があります。
使用する必要があるカルチャは、日付がどのようなカルチャとして書式設定されているかによって異なります。たとえば、解析しているすべての日付が次のようにフォーマットされている場合、 スロバキア語:
String s = "24. 10. 2011";
次に、文字列を次のように解析する必要があります。 スロバキア語 (スロバキア) (sk-SK
) 文化:
//Bad:
d = DateTime.Parse(s);
//Good:
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia)
日付がすべて揃っている場合 タジク語 (タジキスタン キリル文字), 、次のように解析する必要があります tg-Cryl-Tj
:
String s = "24.10.11"
DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj"));
すると次のような疑問が生じます。どのような日付形式を使用していますか?サーバーのロケール設定に依存するのではなく、必要な形式を決定する必要があります。
//Bad
String s = d.ToString();
//Good
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka)
//s = "2011-10-24 12:00:00 පෙ.ව."
あなたはすべて英語で行うことを好むのではないかと思います。ただし、英語のどのバリエーションを決定する必要があります。
en-IA
(英語インド):24-10-2011 15:19:52
en-BZ
(ベリーズ英語):24/10/2011 03:19:52 PM
en-AU
(英語オーストラリア):24/10/2011 3:19:52 PM
en-NZ
(ニュージーランド英語):24/10/2011 3:19:52 p.m.
en-GB
(イギリス英語):24/10/2011 15:19:52
en-ZA
(南アフリカ英語):2011/10/24 03:19:52 PM
en-US
(米国英語):10/24/2011 3:19:52 PM
ただし、日付を文字列に変換するとき、またはその逆のときにどのカルチャを使用するかを本当に決めることができず、日付がユーザーに表示されることを意図していない場合は、 不変の文化:
String s = "10/24/2011" //invariant culture formatted date
d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date
s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string