Часовой пояс Azure и объект javascriptserializer - PullRequest
3 голосов
/ 20 июня 2011

У меня есть приложение на основе прогнозов, работающее в Windows Azure (http://ipredikt.com).Из того, что я могу сказать, часы Azure синхронизируются с часовым поясом GMT.Вот проблема, с которой я сталкиваюсь:

Допустим, у меня есть поле БД с именем CreateDate типа DateTime, и я установил его значение на 10 июня 2011 г., 12:30.когда создается новый прогноз.Если я загляну внутрь таблицы БД, дата будет установлена ​​правильно.Я не касаюсь и не изменяю это значение в любом случае.Однако, когда я читаю значение с помощью нашего API, сериализую его и отправляю клиенту, я получаю дату со значением 9 июня 2011 года, 17:30.(API-библиотека dll также живет в облаке и, вероятно, связана с БД.)

Мой клиентский браузер работает в PST (тихоокеанский часовой пояс), и кажется, что 7-часовая разница обусловлена ​​разницеймежду PST и GMT.Код API, используемый для сериализации значения, подобен следующему:

System.Web.Script.Serialization.JavaScriptSerializer serializer = new JavaScriptSerializer ();

return serializer.Serialize (dataObject);

Это ошибка в объекте JavaScriptSerializer или есть хитрость для исправления этой дельты?По сути, я не хочу, чтобы .NET Framework каким-либо образом вмешивался в это значение, я просто хочу, чтобы поле БД возвращалось как есть.

Ответы [ 2 ]

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

Когда вы передаете объект 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();
2 голосов
/ 20 июня 2011

В сериализованном ответе Json предположительно встречается дата в формате «миллисекунды с начала эпохи», которая также должна включать информацию о часовом поясе, которую браузер учитывает при отображении даты относительно местного часового пояса.

Все это правильное поведение, поэтому ошибок нет. Просто кажется, что вы не хотите такого поведения в вашем случае.

.NET даты имеют свойство "Kind". Если это не указано, предполагается UTC. Сериализатор должен учитывать свойство "Kind" при сериализации. Попробуйте проверить это свойство на вашем объекте до сериализации и измените его на DateTimeKind.Local.

http://msdn.microsoft.com/en-us/library/system.datetime.kind.aspx

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

...