各レコードを検証段階にプッシュしてからデータベースにプッシュすることにより、レコードを処理しています。検証手順の 1 つで、特定の列が日付かどうかを確認する必要があります。プロセスが実行されているマシンで構成された地域設定を使用すると仮定して、DateTime.TryParse(s, out DateTime) を使用してこれを行いました。私のローカル マシンでは、これは Visual Studio のコマンド ライン ハーネス内で実行されるラッパー クラスです (デバッグを容易にするため)。したがって、13/01/2010 は、私の Windows 7 開発マシンの en-GB 設定に従って、2010 年 1 月 13 日としてフォーマットされます。
これをテスト サーバーである Windows Server 2008 R2 にプッシュすると、このラッパー クラスは Window サービス内 (LocalSystem アカウントの下) で実行されます。まったく同じコードですが、サービスが単なる薄いラッパーになるように設計しました。ただし、何度もデバッグを繰り返した後、サーバーは 13/01/2010 を en-US として解析しているため、失敗しているようです。これは、地域設定が en-GB に設定されているにもかかわらずです。(スクリーンショットを参照)
これは SQL Server に到達する前の方法であるため、この問題の一部ではないことに注意してください。
これと戦った後、以下のコードを使用し、必要な形式を en-GB に設定して状況を強制しました。
Culture = CultureInfo.CreateSpecificCulture("en-GB");
DateTimeStyles dateTimeStyles = DateTimeStyles.None;
DateTime dt;
bool pass = DateTime.TryParse(s,Culture,dateTimeStyles, out dt);
これで動作します。私の質問は、ローカル システムで実行されている Windows サービスが en-GB ではなく en-US を前提としているのはなぜですか?