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 - それは正常に動作します:date = TimeZoneInfo.ConvertTimeFromUtc(dateFromDb、TimeZoneInfo.Local);私はこのメソッドをLinqクエリ選択で使用します:Dateフィールドの場合は一度、Timeの場合は一度、同じ日付を参照し、個々の列として提示する必要があります。これは、日付の「正しい」部分が日付のために1回、時刻のために1回取られるので、同様に機能するはずです。 – Francesco
はい、それは心配しないでしょうか?すべてがあなたのためにそのクラスによって行われました;-) –
素晴らしい!それが私の必要なものです。ダビデにもう一度感謝します。 – Francesco