2013-03-28 10 views
5

私は、現在のスレッドの現在のカルチャを変更できることを知っています。 そして、私は1つの文化がアメリカスレッドごとのタイムゾーンを設定するには?

のような多くのタイムゾーンを持っているかもしれませんが、現在のスレッドためタイムゾーンに対処するために、同じ技術を使用しているため。我々はCurrentCultureからTimeZoneInfoを取得できませんでした知っています

我々はこのようなものにすることができれば、それは非常にいいだろう:

TimeZone.CurrentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("timezone id"); 
+1

我々は、.NETサイトのために所望の機能じゃない、私たちがしています固体の質問サイトへの確かな答え。タイムゾーンの処理は、時間の都合の良い時代ではありません。スレッドごとのタイムゾーンの複雑さのレイヤーを追加するだけで、問題を尋ねています。 – Petesh

+0

@ペテシュなぜ私は実際に尋ねるつもりはありませんでした。それが何らかの形で可能かどうか疑問に思っていました。 –

+1

タイムゾーン用のスレッドローカルオブジェクトを作成することを止めるものはありません。コードを使用する以外は何も使用しません。 .NETの['ThreadLocal ' Class](http://msdn.microsoft.com/en-us/library/dd642243.aspx)を見てください。 – Petesh

答えて

5

残念ながら、「現在」の時間帯のいずれかの概念は、そのマシンのオペレーティングシステムの設定に縛られるのコードが実行されています。タイムゾーンを変更するためのWin32 APIがいくつかありますが、使用することはお勧めしません。スレッドセーフではないだけでなく、プロセスセーフでもありません。タイムゾーンの設定は、マシン上で実行されているすべてのものに影響します。

しかし、私はあなたのユースケースが本当に好奇妙なのだろうと言いました。スレッドごとのタイムゾーンを設定する立場にいる場合は、ローカル設定にまったく依存しない可能性があります。おそらくTimeZoneInfoの変換方法を使用することができます。

たとえば、他のタイムゾーンで現在の時刻を検索していたとします。あなたはこれを行うための能力を探している可能性があります:

using (TimeZone.CurrentTimeZone = ... ) 
{ 
    var now = DateTime.Now; 
} 

しかし、その代わりに、あなたは、単に適切な場合にはUTCから変換する必要があります:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
         DateTime.UtcNow, "some other timezone id"); 
+0

タイムゾーンは、多数の異なる関数(例えば、 'AdjustToUniversal'を使って文字列から日時への変換)で暗黙的に使用されます。明示的なタイムゾーンを使用するように手動で確実に変更できますが、大きなコードベースでは容易ではありません。同様に、 'string.Format()'のような関数で使用する文化を明示的に指定することもできますが、スレッドのカルチャを設定して、一度に 'すべて修正する'という選択肢があります。 – MiMo

+2

はい、内部的には多くの機能で使用されていますが、変更することはできません。フックはなく、すべてが封印されています。 1つはcultureinfoのように動作すると思うでしょうが、そうではありません。それはまったく違う。システム全体のタイムゾーン設定は1つだけです。 –

+0

はい、私が知っている - 私の前のコメントは、もし存在すれば、そのようなものの「ユースケースとなるだろう」というあなたの質問への試みられた答えでした。 – MiMo

関連する問題