Как преобразовать UTC DateTimeOffset в DateTime, который использует системный часовой пояс

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. Как я могу получить правильное время в соответствии с моим компьютером?

Ответ 1

Вы можете просто использовать свойство DateTimeOffset.LocalDateTime:

trigger.GetNextFireTimeUtc().Value.LocalDateTime

Из документации:

Если необходимо, свойство LocalDateTime преобразует текущую дату и время объекта DateTimeOffset в локальную системную дату и время. Преобразование является двухступенчатой:

  • Свойство преобразует текущее время объекта DateTimeOffset в координированное универсальное время (UTC).
  • Затем свойство преобразует UTC в локальное время.

Вы действительно должны изучить DateTimeOffset хотя это важный тип, чтобы понять, используете ли вы BCL для работы с датой/временем.

Ответ 2

Этот код предназначен для преобразования utc в локальный

var local = utc.ToLocalTime();