WCF в Entity Framework преобразует мое время в местное время - как остановиться? - PullRequest
2 голосов
/ 04 февраля 2010

У меня есть служба WCF, которая получает записи со значениями даты и времени и сохраняет их в базе данных SQL Azure, используя Entity Framework 3.5, SP1. Запуск его локально, записи сохраняются в базе данных, все хорошо

Однако мой IIS-хостинг находится в другом часовом поясе. Когда я загружаю сайт туда и вызываю ту же службу (с той же строкой подключения, к базе данных SQL Azure), записи все равно сохраняются, но время возвращается на 5 часов назад.

Я проверил Fiddler, чтобы посмотреть выход данных, и это в мое местное время. Я использовал тот же сервис на хостинге Azure, и это тоже хорошо сохранилось. У меня есть те же данные, которые отправляются в другой сервис WCF на том же хосте, сохраняются с Linq2SQL, и это прекрасно.

Единственное отличие - это Entity Framework - я предполагаю, что информация о моем часовом поясе (GMT) отправляется с датой и временем, и поэтому, когда сервер в восточном побережье получает ее, он преобразует ее в местное время, 5 часов ранее.

В некотором смысле, это точно, потому что на данный момент (13:48) это на 5 часов раньше - 08:48, но это не то, что я хочу сохранить в базе данных, я хочу сохранить 13 : 48. Как я и просил, это имеет смысл, когда я запрашиваю это

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

большое спасибо

Toby

1 Ответ

2 голосов
/ 04 февраля 2010

Вы можете попробовать изменить значение DateTimeKind на стороне клиента на Unspecified. Таким образом, WCF и Entity Framework не будут иметь достаточно информации, чтобы попытаться сделать это умно.

DateTime.SpecifyKind
DateTimeKind


Вслед за этим не работает и ваш комментарий в вопросе ...

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

Предполагая, что вы хотите сохранить его как UTC, вам необходимо преобразовать его в UTC на стороне клиента, прежде чем передавать его по сети ( DateTime.ToUniversalTime ), затем вам необходимо убедиться, что сервер распознает его как UTC (он должен делать это автоматически, но вы можете позвонить в SpecifyKind после его получения просто для уверенности). Entity Framework должен , а затем сохранить его в базе данных без изменений - как вы описали в своем комментарии.

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

По крайней мере, таков подход I .

(О, и как коллега-разработчик из Великобритании, я считаю действительно полезным устанавливать время на моем клиентском ПК в любое время, кроме времени Великобритании, когда выполняю такую ​​работу - в противном случае вы будете вводить ошибки, которые вы не заметите. до тех пор, пока мы не перейдем к BST. По моему опыту, это случается после того, как ты ушел из жизни)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...