如何将 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的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL Server DATETIMEOFFSET 转换为 mySQL DateTime