0

新しいサーバーに移動したばかりで、すべてが順調に進んでいます。ただし、以前は「dd/mm/yyyy」形式の文字列を日付に変換しようとしたときに .NET エラーが発生しました。現在は、ローカルの web.config でカルチャ設定を変更しましたが、これをグローバルにする必要があります。 .

これはどこで変更できますか?machine.config を想定しましたが、古いサーバーには使い慣れた設定が見つかりませんでした。

または、サーバー側を見て、マシンのカルチャを en-GB に設定する設定を見つける必要がありますか?

== 更新 == 地域設定を変更しましたが、残念ながらまだ失敗しています。それを台無しにする可能性のある machine.config グローバル設定はありますか? 現時点では、不変を使用していて、それで失敗しているようです。

Windows Server 2008 と IIS7 を使用しています。

使用されている文字列は、1 回限りのサイトの登録フォームの締め切り日であるため、ページにハード コードされています。

実行中のコードは次のとおりです。

if (DateTime.Now > Convert.ToDateTime("26/04/2008 12:00"))

非常に単純で、これまでに何百万回も機能していましたが、このエラーが発生するのはこの新しいセットアップでのみです。

4

3 に答える 3

2

サーバーを移行するときは、可能であれば、以前と同じ地域設定 (コントロール パネル) を使用することをお勧めします。そうするだけで、多くの問題を回避できます。

ただし、新しいサーバーが他の地域設定を必要とする他のアプリケーションをホストする場合、または新しいポリシーのためにそれが必要な場合は、それが不可能になる可能性があります.

いずれにせよ、すべての Parse および ToString() 呼び出し中に、該当する場合は形式を明示的に指定することをお勧めします。

そのための FxCop (および静的分析) ルールさえあります。


質問に関する新しい情報を反映するために更新されました。

Convert.ToDateTime は「便利な」メソッドであり、次のように実装されます。


public static DateTime ToDateTime(string value)
{
    if (value == null)
    {
        return new DateTime(0L);
    }
    return DateTime.Parse(value, CultureInfo.CurrentCulture);
}

明示的な CultureInfo (CultureInfo.CurrentCulture) を渡して DateTime.Parse を呼び出すことに注意してください。

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")))
于 2009-09-30T14:10:46.813 に答える
1

最後に (これが最善の方法であったかどうかはわかりません)、IIS7 内からコンピューターを選択し、そこでグローバリゼーション設定を en-GB に設定する必要がありました。これにより問題が解決され、指定されていない限り、今後も他のすべての Web サイトがそのカルチャで維持されます。

コンピューターの地域設定を既に英国に変更していて、問題が解決していないことに注意してください。

ただし、これからは、日付を解析するカルチャを指定するというアルフレッドの提案を進めます。

于 2009-10-01T14:38:15.840 に答える
0

文字列を日付に変換するときはいつでも、使用するカルチャを指定する必要があります。

使用するカルチャは、日付がどのカルチャとしてフォーマットされているかによって異なります。たとえば、解析しているすべての日付がSlovakとしてフォーマットされている場合:

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

ただし、日付を文字列に、またはその逆に変換するときにどのカルチャを使用するかを本当に決めることができず、日付がユーザーに表示されることを意図していない場合は、Invariant Cultureを使用できます。

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
于 2011-10-24T19:24:32.633 に答える