Миграция с локального сервера на 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, который прекрасно!

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


пару лет назад я начал разрабатывать все свои приложения для обработки дат с использованием 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 от клиента.