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

19
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。你应该看一下这个链接:https://dev59.com/PnVC5IYBdhLWcg3wz0h9 - TryToSolveItSimple
你可能会对DateTime vs DateTimeOffset感兴趣。 - Matt Johnson-Pint
1
此外,您正在查看Quartz 1.0文档。Quartz 2.0将此方法更改为返回DateTimeOffset?如此处所示 - Matt Johnson-Pint
3个回答

47
你可以直接使用DateTimeOffset.LocalDateTime属性:
trigger.GetNextFireTimeUtc().Value.LocalDateTime

根据文档:

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

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

如果你在使用 BCL 进行日期/时间操作,那么你真的应该了解 DateTimeOffset 这个重要类型。


为什么这个答案这么难找?微软的文档太恶心了!!!https://learn.microsoft.com/en-us/dotnet/standard/datetime/converting-between-datetime-and-offset - wruckie

0

我遇到了这个问题,但是这些答案都不是真正的答案(根据这个问题的标题)。以下是一些解决方案示例:

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

.NET5 C# 9.0

enter image description here


-2
此代码用于将UTC时间转换为本地时间。
var local = utc.ToLocalTime();

这只是改变了 DateTime 的类型,而没有改变其值。如果 OP 只是显示该值,则不会看到任何更改。 - Jon Skeet
OP 确实只是显示该值。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接