【问题标题】:How to convert a UTC DateTimeOffset to a DateTime that uses the systems timezone如何将 UTC DateTimeOffset 转换为使用系统时区的 DateTime
【发布时间】: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 时间。如何根据我的电脑获取正确的时间?

【问题讨论】:

标签: c# datetime timezone quartz.net datetimeoffset


【解决方案1】:

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

var local = utc.ToLocalTime();

【讨论】:

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

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

trigger.GetNextFireTimeUtc().Value.LocalDateTime

来自文档:

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

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

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

【讨论】:

【解决方案3】:

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

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

.NET5 C# 9.0

【讨论】:

    猜你喜欢
    • 2012-12-05
    • 2018-09-12
    • 2016-07-22
    • 2013-07-25
    • 2011-02-02
    • 2021-02-14
    • 1970-01-01
    • 2011-02-11
    • 2019-06-04
    相关资源
    最近更新 更多