こんにちは!
タイムゾーンの問題で混乱しました。発行日を含むニュースを含む Web アプリケーションを作成しています。クライアントに、ニュースの発行日を対応する現地時間の形式で表示させたいと考えています。ただし、クライアントがどのタイムゾーンにあるかはわかりません。
3 つの質問があります。
念のため質問する必要があります:DateTimeOffset.UtcNow
サーバーが夏時間に依存しているかどうかに関係なく、常に正しい UTC 日付と時刻を返しますか? たとえば、最初にこのプロパティの値を夏時間の 2 分間前 (または夏時間から移行する前) に取得し、2 回目を転送後の 2 分後に取得した場合、すべてのプロパティの値がケースの違いはわずか 4 分ですか? または、ここでさらにロジックが必要ですか? (質問#1 )
次の例を見て、あなたの考えを教えてください。
サイトにニュースを掲載しました。DateTimeOffset.UtcNow
サーバーのタイムゾーンと夏時間が考慮されていると想定しているため、「送信」ボタンを押すとすぐに正しいUTCサーバー時間が取得されます。この値を MS SQL データベースのdatetime2(0)型のフィールドに書き込みます。
次に、ユーザーはニュースのページを開き、公開後どれだけ経っても. これは、何年も経った後でも発生する可能性があります。私は彼に彼のタイムゾーンを入力するように頼まなかった. 代わりに、次の方法で JavaScript 関数を使用して、UTC からの現在の現地時間のオフセットを取得します。
function GetUserTimezoneOffset()
{
var offset = new Date().getTimezoneOffset();
return offset;
}
次に、ユーザーに表示される公開日時を計算します。
public static DateTime Get_Publication_Date_In_User_Local_DateTime(
DateTime Publication_Utc_Date_Time_From_DataBase,
int User_Time_Zone_Offset_Returned_by_Javascript)
{
int userTimezoneOffset = User_Time_Zone_Offset_Returned_by_Javascript; // For
// example Javascript returns a value equal to -300, which means the
// current user's time differs from UTC to 300 minutes. Ie offset
// is UTC +6. In this case, it may be the time zone UTC +5 which
// currently operates summer time or UTC +6 which currently operates the
// standard time.
// Right? (Question #2)
DateTimeOffset utcPublicationDateTime =
new DateTimeOffset(Publication_Utc_Date_Time_From_DataBase,
TimeSpan.Zero); // get an instance of type DateTimeOffset for the
// date and time of publication for further calculations
DateTimeOffset publication_DateTime_In_User_Local_DateTime =
utcPublicationDateTime.ToOffset(new TimeSpan(0, - userTimezoneOffset, 0));
return publication_DateTime_In_User_Local_DateTime.DateTime;// return to user
}
得られた値は正しいですか?これは、この問題を解決するための正しいアプローチですか? (質問#3)
UPDATED Oct 19 at 6:58 (コメントとして投稿しようとしましたが、668 文字では長すぎます)
マット・ジョンソン、これは初めてではないという事実にもかかわらず、このような詳細な回答をありがとう. 他の投稿へのリンクを提供するだけでなく、この特定のケースを説明するために時間を割いていただきありがとうございます.
あなたが提供した情報を読みました。多分私はまだすべての詳細を完全に認識していませんが、それを正しく理解していれば、DateTime (データベースに何年も前に書き込まれたもの) を UTC から同じユーザーの瞬間に正しく変換するには、UTC を知る必要があります。彼がその瞬間に持っていたオフセット。また、DST の転送ルールが絶えず変化することを考慮するのは困難です。そして今でも、プラットフォーム「.NET」には TimeZoneInfo 型に使用される TZDB が含まれていますが、ユーザーの正確な位置がなければそれを利用することはできません。
しかし、今年の開始日時だけに関心があり、2011 年に DST が取り消されたロシアだけに関心がある場合はどうなるでしょうか。私が理解しているように、これは、ロシアにあるユーザーのコンピューターの時計が適切に構成されていれば、このアプローチは常に正しい結果をもたらすことを意味します。また、2011 年以降、ユーザーの時計の UTC へのオフセットは常に同じである必要があります。したがって、異なるブラウザーのシフト インジケーターは、ロシアのユーザーにとって異なるものではありません。