2011-09-12 8 views
2

GMT 0(グリニッジ標準時)を使用して日付をデフォルトタイムゾーンとして保存し、1時間スプレッドを適用するレガシーDMSアプリケーションを使用します。私はこれらのレコードをGridViewで表示しなければならず、私のシステムが稼動する相対的な場所に応じて一種の変換を適用する必要があります(例ロンドン、バハマなど)。レガシーシステムは、日付をどのように機能するかに探しDBから現地の夏時間の設定を表示する

が、私は適切に日付を表​​示するには、次のアルゴリズムを設計し(私のコードは、asp.net/C#のに基づいています):

//Example for Bahamas, GMT: -5 Hours as offset, I should add 4 hours to the DB date 
//Example for London, GMT: 0 Hour as offset, I should add 1 hour to the DB date 
DateTime dateToDisplay; 
int spreadHours = 0; 

TimeZone cur = TimeZone.CurrentTimeZone; 
DaylightTime daylight = cur.GetDaylightChanges(dateFromDb.Year); 
DateTime start = daylight.Start; 
DateTime end = daylight.End; 

if (dateFromDb.CompareTo(start) <= 0 || dateFromDb.CompareTo(end) >= 0) 
{ 
    spreadHours = -1 - (cur.GetUtcOffset(dateFromDb).Hours);     
} 
else 
{ 
    spreadHours = - (cur.GetUtcOffset(dateFromDb).Hours);     
} 

dateToDisplay = dateFromDb.AddHours(spreadHours); 

は、しかし、私は、もしわかりませんこのプロセスでは、すべてのケースをカバーしたり、同じ結果を達成するためのより良い解決策があるかどうかを判断することができます。

誰かが自分のアイデアを確認したり、より良い方法を提案できますか?あなたは/ローカル時間にUtcDateTimeから変換するために、実際には、

をのTimeZoneInfoクラスを使用する必要がある可能性があり、.NET 3.5から一般的に

答えて

1

すべてを行う必要がこれです:

// here static text but you can initialize the TimeZoneInfo with any Id, check MSDN for this: 
// http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx 

string nzTimeZoneKey = "New Zealand Standard Time"; 

TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey); 
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone); 

あなたはここSOで、この他の質問と回答をチェックすることができます

Convert UTC/GMT time to local time

+0

+1 - それは正常に動作します:date = TimeZoneInfo.ConvertTimeFromUtc(dateFromDb、TimeZoneInfo.Local);私はこのメソッドをLinqクエリ選択で使用します:Dateフィールドの場合は一度、Timeの場合は一度、同じ日付を参照し、個々の列として提示する必要があります。これは、日付の「正しい」部分が日付のために1回、時刻のために1回取られるので、同様に機能するはずです。 – Francesco

+0

はい、それは心配しないでしょうか?すべてがあなたのためにそのクラスによって行われました;-) –

+0

素晴らしい!それが私の必要なものです。ダビデにもう一度感謝します。 – Francesco

0

をMSDNで簡単に見にあなたのような何かを行うことができます示唆しますこの

DateTime dt = new DateTime(dateFromDb.Ticks, DateTimeKind.Utc); 
DateTime dtLocal = dt.ToLocalTime(); 

次に、dtLocalを任意の形式で表示できます。それは、より多くの情報のための正しい夏時間設定で現地時間にMSDN DateTime.ToLocalTime

チェックアウト調整される

編集:私はdateFromDbのDateTimeクラスのインスタンスであることを、ここで仮定してい

+0

これは、サーバーのローカル時刻がブラウザとリモートで接続しているユーザーと同じではないため、ASP.NETでは機能しません。おそらくWindowsアプリケーションで動作しますか? –

+0

OPは 'TimeZone.CurrentTimeZone'を使っていたので、私は彼にWindowsアプリケーションがあると仮定しました。 'DateTime.ToLocalTime()'と 'TimeZone。CurrentTimeZoneはASP.netアプリケーションのリモートユーザのタイムゾーン設定に従って動作しません。 – danishgoel

+0

質問はASP.NET –

1

タイムゾーンを扱うことは、あなたが思うほど明確ではありません。

トロイハントすることにより、以下の記事を読む

http://www.troyhunt.com/2011/08/overcoming-sql-08s-globally-insensitive.html

彼だが、.NETのタイムゾーンを扱うについて非常に詳細に入るが、それはすぐにわかります良い過去記事は何落とし穴(および可能な解決策)があります。

+0

+1 - 非常に細かい記事です! – Francesco

関連する問題