Миграция с локального сервера на Azure: часовой пояс UTC. Как решить?
Я разработал свое приложение, учитывая тот факт, что, согласно спецификациям, должен работать на сервере, расположенном в Италии, и клиентами будут только итальянцы.
около месяца назад мой ЛС решил принести все это на Azure.
все прошло гладко. Единственное, что дает мне некоторую проблему, это тот факт, что сервер времени-UTC.
решения:
A) простой
изменить загрузочный скрипт на серверное время ( http://netindonesia.net/blogs/wely/archive/2011/06/26/setting-timezone-in-windows-azure.aspx )
Б) более трудоемкий
изменение, чтобы сделать любое приложение использовать UTC и показать время, правильно преобразованное в местное время.
Если я пойду на решение, мое сомнение заключается в том, что тот факт, что сервер настроен с другим часовым поясом, может каким-то образом создавать конфликты с Azure.
Это правда?
3 ответов
Я попросил МС поддержка.
вот ответ:
не рекомендуется изменять время сервера на виртуальных машинах Azure с помощью задачи запуска, вы должны использовать такие методы, как TimeZoneInfo.ConvertTimeFromUTCTime в коде.
поэтому я не буду менять часовой пояс сервера. Ожидая ответа от поддержки, я обнаруживаю, что SqlServer 2008 имеет тип данных DateTimeOffset, который прекрасно!
пару лет назад я начал разрабатывать все свои приложения для обработки дат с использованием UTC на клиенте и сервере и с тех пор не оглядывался назад.
есть две проблемы с DateTime.Сейчас и в DateTime.Сегодня на стороне клиента и на стороне сервера. При передаче объекта DateTime из клиента в Azure его вид равен локальному и содержит сведения о часовом поясе. (10 июня 2011, 12:30 -7)
однако при сохранении в базе данных информация о регионе теряется. Впоследствии при чтении этого поля из базы данных он создает DateTime с областью Utc (10 июня 2011, 12:30am 0)
в конце концов, ваш клиент неправильно считывает даты.
существует несколько вариантов решения этой проблемы на стороне клиента.
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.Теперь на стороне сервера. Вам лучше использовать DateTime.UtcNow. Это время не должно использоваться для бизнес-данных. В идеале, вы должны выполнить рефакторинг кода и передавать типа DateTime и DateTimeOffset от клиента.