c# - 从 DateTime (utc) 和 TimeZoneInfo 获取 DateTimeOffset

标签 c# datetime

我需要将 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/

相关文章:

c# - Telerik RadControls,控制当 EnableEmbeddedScripts 为 true 时生成 ScriptResource.axd 文件的位置

c# - 发布版本 : "Common Language Runtime detected an invalid program." 上的 nunit

C# 将 FileStream.WriteLine 转换为 MemoryStream

c# - 使用默认参数重载构造函数

python - Django 会自动检测最终用户的时区吗?

c# - 如果 T 在泛型中为空怎么办?如何省略尖括号

带日期的python datetime实例检查返回true

MYSQL - 将日期从 2020 年更改为 2011 年

c# - 十进制时间跨度年份和月份 c#

python - 日期时间不可迭代 - 创建列表时出错