2015-06-16 5 views
0

На моем сервере dev я сохраняю значение, называемое «ScheduledDateUtc», дате sqlserver, например. 24-11-14 09:00:00. Я также сохранить значение, называемое «UtcOffset» и вычислить «ScheduledDateLocal», как так:UTC Время, отличающееся от серверов в разных часовых поясах?

var ScheduledDateLocal = ScheduledDateUtc.AddHours(UtcOffset); //a negative offset would be deducted and a positive offset would be added 

На моем Dev сервере это работает отлично, и его вычисляет правильную ScheduledDateLocal для Alle часовых поясов/UtcOffset годов. Однако, когда я развертываю сервер Azure в другом часовом поясе, этот расчет занимает несколько часов.

Может ли кто-нибудь объяснить, почему? Я предполагаю, что есть какой-то параметр или параметр настройки для конкретной системы? Благодаря!

+0

Знаете ли вы, в какой временной зоне находится ваш сервер Azure? – user990423

+0

Im в UTC + 1, и расчет слишком частый, так что я предполагаю UTC0 – Corstiaan

+1

. Я предполагаю, что вы инициализируете ScheduledDateUtc как время и время Utc. Однако я ожидаю, что это будет некорректно на вашей машине, а не на Azure, что Я бы предположил, что на Utc. Я думаю, нам нужно увидеть пример ввода, вывода на вашем компьютере и выхода на Azure. –

ответ

1

Возможно ли, что неправильный результат на вашем компьютере, а не в 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 и оттуда до серверного времени.

+0

Это интересно. Благодарю. Попробуем это tomorow – Corstiaan

+0

Это сработало.В следующий раз лучше сохранить timezoneinfo, хотя ... – Corstiaan

+0

Отлично, спасибо, что позволил мне знать, что это сработало. –

Смежные вопросы