Возможно ли, что неправильный результат на вашем компьютере, а не в Azure, и потому, что вы инициализируете ScheduledDateUtc
как местное время, а не UTC?
Рассмотрим эти две строки кода:
new DateTime(2015, 6, 1, 1, 1, 1).AddHours(5).ToUniversalTime().Dump();
new DateTime(2015, 6, 1, 1, 1, 1, DateTimeKind.Utc).AddHours(5).ToUniversalTime().Dump();
Здесь мы в летнее время, которое UTC + 1. Выход выше:
01/06/2015 05:01:01
01/06/2015 06:01:01
Они 1 час, как Я «забыл» указать, что ввод - это UTC в конструкторе в первой строке кода.
Если у вас нет доступа к конструктору, так как ScheduledDateUtc
инициализируется с помощью ORM, вы можете использовать SpecifyKind
:
ScheduledDateUtc = DateTime.SpecifyKind(ScheduledDateUtc, DateTimeKind.Utc)
Его жаль, что вы храните смещения не часовой пояс, как вы, возможно, проблемы с летним временем. Если вы хранили имя часового пояса для Windows, вы можете использовать TimeZoneInfo.ConvertTimeFromUtc
(нет необходимости указывать Kind
здесь, так как это предполагает UTC) в соответствии с этим, например, из MSDN:
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
ScheduledDateLocal = TimeZoneInfo.ConvertTimeFromUtc(ScheduledDateUtc, cstZone);
Вы могли вместо экземпляра "custom" timezone используя ваше смещение и по-прежнему использовать вышеуказанную функцию.
Я столкнулся с similar issue, где мне приходилось планировать события на основе местного времени пользователя. Я закончил тем, что хранил день недели, час, минуту и Olson timezone, и использовал Noda-Time для преобразования в DateTimeOffset и оттуда до серверного времени.
Знаете ли вы, в какой временной зоне находится ваш сервер Azure? – user990423
Im в UTC + 1, и расчет слишком частый, так что я предполагаю UTC0 – Corstiaan
. Я предполагаю, что вы инициализируете ScheduledDateUtc как время и время Utc. Однако я ожидаю, что это будет некорректно на вашей машине, а не на Azure, что Я бы предположил, что на Utc. Я думаю, нам нужно увидеть пример ввода, вывода на вашем компьютере и выхода на Azure. –