2017-09-14 15 views
0

テストする必要があるDateTime拡張機能をいくつか作成しました。それらをテストするために、私は、DateTimeインスタンスがインスタンスを作成するローカルサーバーのもの以外のさまざまなタイムゾーンを表していることをシミュレートできるようにする必要があります。.NET内の非ローカルTimeZoneのDateTimeインスタンス

私は、次の...

// 
// Create the new date to test. It will be in the timezone of the server it was created on (EST).  
    DateTime localDate   = new DateTime(2017, 11, 14, 12, 0, 0); 
// 
// Get the TimeZone for another locale 
    TimeZoneInfo newTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Egypt Standard Time"); 
// 
// Convert the localDate into a DateTime instance as if created on a server located in 
// "Egypt Standard Time". - NOT WORKING 
    DateTime test    = TimeZoneInfo.ConvertTime(localDate, origTimeZone); 
// 
// run the test 
    Boolean result = test.ExtensionMethod() 

を試してみました。しかし、「テスト」で、この結果だけでは、ローカルEST TZ内の別のDateTimeています。時間はエジプトの時間を反映するように変更されましたが、評価されると、例えば "toUniversalTime"に変換されたインスタンスは、ESTタイムゾーンのように変換されます。

上記の例では、変数「テスト」には、「2017-11-14 19:00:00」の日付時刻が含まれます。私がUTCに変換すると、私は '2017-11-14 17:00:00'の結果を期待していました。代わりに私は '2017-11-15 00:00:00を得ています。

ローカルサーバーのタイムゾーン以外のタイムゾーンからDateTimeをインスタンス化する方法はありますか?

+0

UTCに特定のゾーン内のDateTimeから変換するためのオーバーロードがあります。基本的な "タイムゾーン"としてUTCを使用することは、これを扱うときには良いアイデアです。入力と出力のタイムゾーンを気にする必要があり、コアが機能するはずです。 –

+0

コメントをいただきありがとうございますが、あなたが説明する練習に同意し、完全に同意してください...残念ながら私の状況ではありません。私が本当に知る必要があることは、私が求めていることができるかどうかです。それが行われるべきであるかどうかは状況に左右され、私は会議をプロジェクトチームと議論するように設定しました...再び...フィードバックに感謝します。 –

+0

ここで間違った変数を使用したことがありますか? TimeZoneInfo.ConvertTime(localDate、 'origTimeZone'); –

答えて

1

DateTimeには、タイムゾーン情報は含まれません。 ToUniversalTimeは、常にローカルシステムのタイムゾーンを使用してUTCに変換します。

オリジナルのオブジェクトのToUniversalTimeを呼び出すと、あなたが探している価値が得られます。 ESTで動作しているマシンの '2017-11-14 12:00:00'は '2017-11-14 17:00:00'(+5時間)に変換されます。

DateTimeOffsetクラスを使用して、日付/時刻とともにオフセット値を含めることもできます。これにより、ToUniversalTimeのようなオペレーションでは、ローカルタイムゾーンオフセットを仮定するのではなく、オフセットを認識してそれに応じて変換を実行することができます。 DateTimeOffsetを使用して

例:

TimeZoneInfo origTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTimeOffset localDate = new DateTimeOffset(2017, 11, 14, 12, 0, 0, origTimeZone.BaseUtcOffset); 

Console.WriteLine(localDate); // 2017-11-14 12:00:00 (EST) 

TimeZoneInfo newTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Egypt Standard Time"); 
DateTimeOffset test = TimeZoneInfo.ConvertTime(localDate, newTimeZone); 

Console.WriteLine(test); // 2017-11-14 19:00:00 (EGST) 
Console.WriteLine(test.ToUniversalTime()); // 2017-11-14 17:00:00 (UTC) 

出力:

11/14/2017 12:00:00 PM -05:00 
11/14/2017 7:00:00 PM +02:00 
11/14/2017 5:00:00 PM +00:00 
関連する問題