私のデータベースはカリフォルニアなどにあります。私のユーザーテーブルには、-0700 UTC など、すべてのユーザーのタイムゾーンがあります
ニューヨークなどに住んでいるユーザーに日付を表示するたびに、データベース サーバーから時刻を調整するにはどうすればよいですか? UTC/GMT -4 時間
データを UTC 形式で保存し、ローカル タイムゾーン形式で表示する必要があります。
DateTime.ToUniversalTime() -> server;
DateTime.ToLocalTime() -> client
AddXXX メソッド グループを使用して日付/時刻を調整できますが、エラーが発生しやすくなります。.NET は、System.TimeZoneInfoクラスでタイム ゾーンをサポートしています。
.Net を使用する場合は、.Net を使用できますTimeZoneInfo。質問に「c#」のタグを付けたので、そうすると思います。
最初のステップは、TimeZoneInfo変換先のタイム ゾーンの を取得することです。あなたの例では、ニューヨークのタイムゾーンです。これを行う方法は次のとおりです。
//This will get EST time zone
TimeZoneInfo clientTimeZone
= TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
//This will get the local time zone, might be useful
// if your application is a fat client
TimeZoneInfo clientTimeZone = TimeZoneInfo.Local;
次に、DB から a を読み取った後、それが正しく設定されDateTimeていることを確認する必要があります。KindDB 内の が UTC であると仮定するとDateTime(ちなみに、通常はこれが推奨されます)、次のように変換するように準備できます。
DateTime aDateTime = dataBaseSource.ReadADateTime();
DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc);
最後に、別のタイム ゾーンに変換するには、次のようにします。
DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone);
いくつかの余分な発言:
TimeZoneInfoいくつかの特定のタイム ゾーンのみに関心がある場合は、静的フィールドに格納できます。TimeZoneInfo夏時間に関する情報を保存します。したがって、それについて心配する必要はありません。これが役立つことを願っています。:)
ご存知のとおり、これは良い質問です。今年、私は最初のDBアプリケーションを作成しました。時間に関連する入力データは、Int64値であるため、DBに保存しました。私のクライアントアプリケーションはそれを取得し、その値に対してDateTime.FromUTC()またはFromFileTimeUTC()を実行し、.LocalTime()を実行して現地時間で物事を表示します。これが良い/悪い/ひどいのかどうか疑問に思いましたが、これまでのところ私のニーズには十分に機能しています。もちろん、作業は、DB自体ではなく、私が作成したデータアクセス層ライブラリによって行われることになります。
十分に機能しているように見えますが、この種のことについてより多くの経験を持っている他の人が、これが最善のアプローチではない場所を指摘できると信じています。
幸運を!
.NET 3.5 (VS 2008) まで、.NET には、UTC との間の変換を除いて、タイムゾーンのサポートが組み込まれていません。
時差が 1 年中 (夏と冬) 常に正確に 3 時間である場合は、 を使用yourDate.AddHours(3)して一方の方法を変更し、元の方法でyourDate.AddHours(-3)変更します。この 3 時間を足し算/引き算する理由を説明する関数に、必ずこれを考慮に入れてください。
TimeZoneInfo.GetSystemTimeZones() の組み合わせを使用してから、TimeZoneInfo.BaseUtcOffset プロパティを使用して、オフセットの差に基づいてデータベース内の時間をオフセットできます。
System.TimeZoneInfo に関する情報はこちら