4

各レコードを検証段階にプッシュしてからデータベースにプッシュすることにより、レコードを処理しています。検証手順の 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 を前提としているのはなぜですか?

4

3 に答える 3

3

説明

を使用して、現在のスレッドのカルチャをこれに設定できますThread.CurrentThread.CurrentCulture。これは、現在のスレッドのすべてのカルチャ固有のものに影響します。

サンプル

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");

詳しくは

アップデート

サービスがSYSTEMアカウントで実行されている場合、アカウントプロファイルに関連付けられている地域設定は無関係のようです。Windowsサービスのデフォルトのカルチャはですen-US。ウェブ上には多くの議論があります。私の答えのように、すべて「CurrentThreadの文化を設定する」で終わります。

于 2012-02-03T17:23:18.543 に答える
1

数日前にこの問題に遭遇しました。しばらくして、アプリケーション プール ID 設定がローカル システム アカウントに設定されていることに気付きました。カスタム アカウント (管理者) を使用するように変更したため、カルチャを設定する必要はありません。現在のスレッド。

于 2012-08-14T10:09:04.860 に答える