Миграция с локального сервера на Azure: TIMEZONE UTC. Как решить? - PullRequest
7 голосов
/ 28 июня 2011

Я разработал свое приложение, учитывая тот факт, что, согласно спецификациям, оно должно работать на сервере, расположенном в Италии, и клиентами будут только итальянцы.

Примерно месяц назад мой босс решил принести еговсе на Azure.

Все прошло гладко.Единственное, что доставляет мне некоторые проблемы, это тот факт, что сервер времени - это UTC.

Решения:

A) просто

изменитьсценарий запуска для времени сервера (http://netindonesia.net/blogs/wely/archive/2011/06/26/setting-timezone-in-windows-azure.aspx)

B) более трудоемкий

Измените, чтобы любое приложение использовало UTC и правильно отображало времяпреобразовано в местное время.

Если я пойду на решение, я сомневаюсь, что тот факт, что сервер настроен с другим часовым поясом, может как-то создавать конфликты с Azure.

Это правда

Ответы [ 3 ]

12 голосов
/ 28 июня 2011

Я попросил поддержки MS.

Это ответ:

Изменение времени сервера на виртуальных машинах Azure с помощью задачи запуска не рекомендуется вам лучше использовать такие методы, как TimeZoneInfo.ConvertTimeFromUTCTime в вашем коде.

Так что я не буду менять часовой пояс сервера.В ожидании ответа от службы поддержки я обнаружил, что SqlServer 2008 имеет идеальный тип данных DateTimeOffset!

http://blogs.msdn.com/b/davidrickard/archive/2012/04/07/system-datetime-good-practices-and-common-pitfalls.aspx

4 голосов
/ 29 июня 2011

Пару лет назад я начал разрабатывать все свои приложения для последующей обработки дат с использованием UTC как на клиенте, так и на сервере и с тех пор не оглядывался назад.

2 голосов
/ 29 июня 2011

Есть две проблемы с DateTime.Now и DateTime.Today на стороне клиента и на стороне сервера.Когда вы передаете объект DateTime от клиента в Azure, его Kind равен Local и содержит информацию о часовом поясе.(10 июня 2011 г., 12:30 -7)

Однако при сохранении в базе данных информация о регионе теряется.Впоследствии при чтении этого поля из базы данных он создает DateTime с регионом Utc (10 июня 2011 года, 0:30 утра)

В конечном итоге ваш клиент неправильно читает дату и время.

Естьнесколько вариантов решения этой проблемы на стороне клиента.

1) Преобразование DateTime в DateTimeOffset в параметрах метода, а также в базе данных.Это гарантирует, что ваш Локальный регион (т.е. PST) будет сохранен в db

2) Использовать DateTime.SpecifyKind (dateTime, DateTimeKind.Unspecified) - таким образом, тип DateTime не указывается и впоследствии сохраняется как вБД.

var timeNow = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
serviceClient.SaveTime(timeNow);
var dateTime = serviceClient.GetTime();

Будьте осторожны, чтобы вызвать DateTime.Now на стороне сервера.Вам лучше использовать DateTime.UtcNow.Это время не должно использоваться для бизнес-данных.В идеале вам потребуется рефакторинг вашего кода и передача DateTime или DateTimeOffset от клиента.

...