2016-04-08 6 views
0

私は、MySQLのdatetimeフィールドにデータを格納し、私は( someDate.ToUniversalTime()を使用して)は、C#から常に存在UTCの日付を保存しました。UTCの日時変換

私は中央ヨーロッパのタイムゾーンにいます。

08.03.2016に2016-04-07 16:00:00として保存された日付が1つあります(この時点でイベントが設定されています)。このイベントの現地時間は2016-04-07 17:00:00となっており、その時点でGMT + 1として保存されていました。正しいローカルタイムを取得するためにsomeDate.ToLocalTime()を使用し、うまくいきました。

3月の終わりにDayLightイベントが発生したため、GMT + 2オフセットがあり、現在someDate.ToLocalTime()は1時間以上前に表示されます:2016-04-07 18:00 :00は正しくありません。

どのようにこれを普遍的に解決するには? 現在のUTC時刻を保存してから、ユーザーの現在のタイムゾーンを使用するシステム変換を適用し、現在のDayLightSavingステータスに関する保存されたUTC日付から正しいローカル時刻を常に返したいとします。 また、2016-04-07 17:00:00を返す必要があります。2016-04-07 18:00:00

+0

使用' TIMESTAMP'を同じ値を印刷して、 'time_zone'セッション変数-MySQLを設定します残りを処理します。 – eggyal

+0

これはデスクトップアプリですか、ウェブアプリですか?一般に、デスクトップアプリケーションだけが 'ToLocalTime'と' ToUniversalTime'を使用すべきです。 –

答えて

1

あなたの仮定は間違っています:2016-04-07 16:00 UTCの有効なローカル時間中部ヨーロッパ時間帯は常に2016-04-07 18:00で、決して2016-04-07 17:00ではありません。あなたは現在の日付ではなく、あなたが見ている日付に関して常にUTCオフセットを計算しなければなりません。

次のコードを試してください。それは、常にDATETIME` `のではなく、(あなたがdaylightsavingに現在あるかどうか、すなわち)あなたの現在の日付に関係なく、

var dt1 = new DateTime(2016, 3, 1, 15, 0, 0, DateTimeKind.Utc); 
var dt2 = new DateTime(2016, 5, 1, 15, 0, 0, DateTimeKind.Utc); 

var s1 = dt1.ToLocalTime().ToString("s"); 
var s2 = dt2.ToLocalTime().ToString("s"); 

Console.WriteLine(s1); //prints 2016-03-01T16:00:00 because GMT+1 at that date 
Console.WriteLine(s2); //prints 2016-05-01T17:00:00 because GMT+2 at that date