日付/時刻を正しく処理する最も安全な方法は、すべてをUTCとして保存し、現地時間で表示することです。Guffaが示唆しているように、すべての日付/時刻の計算はUTCで行う必要があります。UTCで保存し、表示しながらその場で現地時間に変換します。
タイムゾーンに日付/時刻を認識させる方法
Microsoftには、DateTime変数とTimeZoneInfo変数を構造体にカプセル化する方法に関する記事があります。
これは、現地時間を簡単に取得できるように1つのプロパティが追加されたMicrosoftのサンプル構造です。これを完全に使用するには、さらに作業が必要ですが、良いスタートです。
public struct TimeZoneTime
{
public TimeZoneInfo TimeZone;
public DateTimeOffset Time;
public TimeZoneTime(DateTimeOffset time)
{
this.TimeZone = TimeZone.Local;
this.Time = time;
}
public TimeZoneTime(TimeZoneInfo tz, DateTimeOffset time)
{
if (tz == null)
throw new ArgumentNullException("The time zone cannot be a null reference.");
this.TimeZone = tz;
this.Time = time;
}
public TimeZoneTime AddTime(TimeSpan interval)
{
// Convert time to UTC
DateTimeOffset utcTime = TimeZoneInfo.ConvertTime(this.Time, TimeZoneInfo.Utc);
// Add time interval to time
utcTime = utcTime.Add(interval);
// Convert time back to time in time zone
return new TimeZoneTime(this.TimeZone, TimeZoneInfo.ConvertTime(utcTime, this.TimeZone));
}
public DateTime LocalDate
{
get { return Time.ToOffset(TimeZone); }
}
}
あなたのシナリオ
はい、メールオブジェクトのReceivedTimeまたはSentOnのいずれかを使用し、保存と計算のためにUTCに変換します。これは、上記のサンプルよりもはるかに複雑ではありません。
Message msg = new Message();
DateTime received = msg.ReceivedTime.ToUniversalTime();
received.AddDays(7);
Console.WriteLine(received.ToLocalTime());