如何将 UTC DateTimeOffset 转换为使用系统时区的 DateTime

Posted

技术标签:

【中文标题】如何将 UTC DateTimeOffset 转换为使用系统时区的 DateTime【英文标题】:How to convert a UTC DateTimeOffset to a DateTime that uses the systems timezone 【发布时间】:2014-12-05 10:34:20 【问题描述】:

Quartz.net 提供了一种获取下一个触发事件的下一次时间的方法:http://quartznet.sourceforge.net/apidoc/1.0/html/html/cc03bb79-c0c4-6d84-3d05-a17f59727c98.htm

文档声称此Trigger.GetNextFireTimeUtc() 方法返回DateTime?,但它实际上返回DateTimeOffset?。我真的不明白DateTimeOffset 的用途或为什么这个函数返回一个而不是常规的DateTime。我想要的只是下次触发器将在我的时区运行时。

我这样做了trigger.GetNextFireTimeUtc().Value.DateTime,但它给了我提前 2 小时的时间,即 UTC 时间。如何根据我的电脑获取正确的时间?

【问题讨论】:

使用LocalDateTime。你应该有 [look][1] [1]: ***.com/questions/179940/… 您可能对DateTime vs DateTimeOffset感兴趣。 另外,您正在查看 Quartz 的 1.0 文档。 Quartz 2.0 将此方法更改为返回DateTimeOffset?、as shown here。 【参考方案1】:

这段代码是将utc转换为本地

var local = utc.ToLocalTime();

【讨论】:

只是会改变DateTime的种类,而根本不会改变它的值。如果 OP 只是显示值,那么他们不会看到任何变化 OP 确实只是显示值【参考方案2】:

您可以只使用DateTimeOffset.LocalDateTime 属性:

trigger.GetNextFireTimeUtc().Value.LocalDateTime

来自文档:

如有必要,LocalDateTime 属性会将当前 DateTimeOffset 对象的日期和时间转换为本地系统的日期和时间。转换是一个两步操作:

该属性将当前 DateTimeOffset 对象的时间转换为协调世界时 (UTC)。 该属性然后将 UTC 转换为本地时间。

不过,您确实应该查看 DateTimeOffset - 这是了解您是否将 BCL 用于日期/时间工作的重要类型。

【讨论】:

为什么这个答案这么难找? M$ Docs 是邪恶的!!! https://docs.microsoft.com/en-us/dotnet/standard/datetime/converting-between-datetime-and-offset【参考方案3】:

我遇到了这个问题,但这些都不是真正的答案(通过这个问题标题)。题名解题示例:

var myDateTimeOffset = (DateTimeOffset)DateTime.UtcNow;
var ans1 = myDateTimeOffset.DateTime.ToLocalTime();
var ans2 = myDateTimeOffset.DateTime.ToLocalTime().ToLocalTime(); // ans1==ans2

.NET5 C# 9.0

【讨论】:

以上是关于如何将 UTC DateTimeOffset 转换为使用系统时区的 DateTime的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# datetimeOffset 转换为指定格式

如何将服务器时间转换为本地时间

将 SQL Server DATETIMEOFFSET 转换为 mySQL DateTime

DateTimeOffset vs DateTime

如何将 DateTimeOffset ToString("o") 偏移量设置为 00 [关闭]

如何将 UTC 时间转换为本地时间