2011-04-27 19 views
4

I持っている彼らの地理的位置のオフセットGMTを使用して、ユーザーの入力からUTC DateTimeを作成する方法:.NET:夏時間の会計

public static DateTime LocalToUtc 
    (int year, int month, int day, int hour, decimal gmtOffset) { 

    // argument validation here 

    var dateTime = new DateTime(year, month, day).AddHours(hour); 
    var dateTimeOffset = 
     new DateTimeOffset(dateTime, TimeSpan.FromHours(gmtOffset)); 

    return dateTimeOffset.UtcDateTime; 

} 

問題は、この関数は時間でオフになっていることですユーザーのタイムゾーンで夏時間が節約されている場合。

個人的なGMTオフセットは-8ですが、現在のタイムゾーンオフセットは夏時間のため-7です。

夏時間を考慮して上記の関数を変更するにはどうすればよいですか? GMTオフセットからタイムゾーンオブジェクトを作成し、タイムゾーンオフセットを取得する必要がありますか?

答えて

1

DateTimeにはすでにToLocalTime()ToUniversalTime()というメソッドがあります。それを使って何が問題なのですか?

EDIT:

著者は、現在のコンピュータのタイムゾーン以外のタイムゾーンからUTCに変換しようとしていることをコメントに基づいて、その後、私はあなたがMSDN documentationからHere

に答えるジョンSkeetsを参照してください。

string displayName = "(GMT+06:00) Antarctica/Mawson Time"; 
string standardName = "Mawson Time"; 
TimeSpan offset = new TimeSpan(06, 00, 00); 
TimeZoneInfo mawson = TimeZoneInfo.CreateCustomTimeZone(standardName, 
    offset, displayName, standardName); 
Console.WriteLine("The current time is {0} {1}", 
        TimeZoneInfo.ConvertTime(DateTime.Now, 
         TimeZoneInfo.Local, mawson), mawson.StandardName);  
+0

異なるタイムゾーンで値を比較すると、DateTimeがバグです。 UTCの種類Localがまったく設定されていないときは、特に迷惑です。 – GregC

+0

@GregC - いいえ、バグではありません。 DateTimeに正しいローカルタイム情報が設定されているかどうかは必ずしも確かではありません。そのため、比較を行うためにUTCに変換します。 –

+1

@Mystere Man、GregCは正しく、DateTime構造体は異なるタイムゾーンを扱うのには適していません。これは、なぜDateTimeOffset構造体が導入されたのかです。 –

0

組み込みのUTCメソッドを使用しない場合は、TimeZone.GetUtcOffsetメソッドを使用する必要があります。

http://msdn.microsoft.com/en-us/library/system.timezone.getutcoffset.aspx

それはあなたのUTCオフセットあなたを与えるだろう。また、組み込みメソッドを使用して、現地時間からUTC時間を取得することもできます。

http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime(v=VS.100).aspx

+0

GetUtcOffsetを呼び出すTimeZoneオブジェクトを取得するにはどうすればよいですか?私が知っているのは、ユーザーのGMTオフセットです。 – DotNetQuestionDate

0

それはあなたが必ずしもマシンのローカルタイムゾーンでない可能性がありますそのオフセット時間のユーザーを求めているに聞こえるので、ローカルマシンの時間は動作しません。しかし、TimeZoneInfoクラスを使用すると、オフセットとDSTの状態を考慮し、そこから組み込みのメソッドを使用するインスタンスを構築できるはずです。

編集:私のマシンでは、少なくとも、TimeZoneInfo.GetSystemTimeZones()はすべての有効なタイムゾーンを返すようです。これは、ユーザーが選択できるようにドロップダウンメニューに簡単にマッピングすることができます。

+0

GMTオフセットは、地理的データセットに基づいて計算されます。登録時に緯度/経度を選択する必要があります。この緯度/経度は、GMTオフセットを導出するDBテーブルで検索されます。 – DotNetQuestionDate

+0

タイムゾーンを取得するために緯度/経度を入力していますか、それとも他の目的にも使用されていますか?そうでなければ、 'TimeZoneInfo.GetSystemTimeZones()'を使い、ユーザにドロップダウン選択を与えることができます。代わりに、このデータセットだけでオフセットやDST情報も与えられますか? DST情報がある場合は、その場でTimeZoneInfoのカスタムインスタンスを作成できます。 –

2

実際のタイムゾーンを知らなくてもそれを行う方法はありません。いくつかのタイムゾーンは同じベースUTCオフセットを持ちますが、夏時間のルールは異なります。たとえば、W.ヨーロッパ標準時およびW.中央アフリカ標準時のオフセットは+01:00ですが、前者はDSTをサポートし、後者はDSTをサポートしていません。 DSTが適用されるかどうかを判断するにはオフセットが足りません。

gmtOffsetの代わりにTimeZoneInfoパラメーターを使用する必要があります。この方法で、TimeZoneInfo.ConvertTimeメソッドを使用して日付を変換するだけで、自動的にDSTが考慮されます。

+0

さて、私は自分のタイムゾーンを教えてくれたデータがあるとしましょう。TimeZoneInfoオブジェクトを作成するにはどうすればいいですか?つまり、パラメータをTimeZoneInfoに変更します。はい。次に、関数に送るTimeZoneInfoオブジェクトが必要です。それはどのように構築されますか? – DotNetQuestionDate

+2

'TimeZoneInfo.FindSystemTimeZoneById'メソッドを使用できます。あるいは、 'TimeZoneInfo.GetSystemTimeZones'メソッドを使ってすべてのタイムゾーンのリストを取得し、そのリストからユーザを選択させることもできます。 –

+0

または、TimeZoneInfo.CreateCustomTimeZoneを呼び出して、任意のタイムゾーンをインスタンス化することができます。 –