我需要将 DateTime+TimeZoneInfo 转换为 DateTimeOffset。
我该怎么做?我假设我必须通过 TimeSpan 但我不确定是否会正确处理夏令时..
谢谢!
更新
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
return new DateTimeOffset(DateTime.UtcNow, timeZone.BaseUtcOffset);
这段代码抛出异常..
The UTC Offset for Utc DateTime instances must be 0.\r\nParameter name: offset
更新 2
抱歉,我没有意识到 DateTimeOffset 只包含偏移量,它不包含实际的区域信息 - 所以我接受@Dave 的回答,因为我将使用它..
最佳答案
您应该即将了解 DateTime.UtcNow 和 DateTime.Now 之间的区别
var now = DateTime.Now;
var utcNow = now.ToUniversalTime();
var ts = utcNow - now;
如果您要保存偏移量,通常以 UTC 格式保存所有日期(尤其是在数据库中)是有益的,这样您就不必处理偏移量。您只需在显示之前转换它们,但所有计算都以 UTC 进行。
编辑:如果您有一个 TimeZone 对象,您可以将 UTC 日期转换为该时区的本地时间。
TimeZone.CurrentTimeZone.ToLocalTime()
或
DateTime dt = TimeZoneInfo.ConvertTimeFromUtc()
下面是一些示例代码,将列出所有时区的日期。
var dt = new DateTime(2011, 5, 21, 11, 0, 0);
foreach (var tzi in TimeZoneInfo.GetSystemTimeZones())
{
Console.WriteLine(string.Format("Time in {0} is {1}", tzi.DisplayName, TimeZoneInfo.ConvertTimeFromUtc(dt, tzi)));
}
关于c# - 从 DateTime (utc) 和 TimeZoneInfo 获取 DateTimeOffset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284124/