正确处理日期/时间的最安全方法是将所有内容存储为 UTC 并以本地时间显示。正如 Guffa 建议的那样,所有日期/时间数学都应该在 UTC 中完成。以 UTC 存储并在显示时即时转换为本地时间。
如何使时区感知日期/时间
Microsoft 在此处有一篇关于如何将 DateTime 和 TimeZoneInfo 变量封装到结构中的文章。
这是 Microsoft 的示例结构,添加了 1 个属性以轻松获取本地时间。这需要更多的工作才能完全有用,但这是一个好的开始。
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());