Вопрос

Часовой пояс в БД и при сохранении

Добрый день!

Есть конф.сервис, метод которого вызывает сторонняя система, добавляет обращение. У обращения есть даты (регистр, реакц, решения и тд). Даты хранятся в БД в формате UTC 0.
Дата приходит ко мне по Москве (+3 часа), я из нее вычитаю эти три часа и кладу в базу.
НО потом оказывается что в базе лежит дата на два часа меньше пришедшей. (и в карточках отображается на час больше, чем нужно) Ну т.е. при сохранении в какой-то момент ТС делает плюс час, хотя у пользователя, под которым происходит авторизация, часовой пояс установлен UTC 0. 
Что это?! Объясните, как это работает О_о
Пример:
Сервис отдает то, что сохранил в базу:
и там "dateCreate\":\"2018-12-25T16:33:18Z\"

Делаю select в базу, а там:

25.12.2018 17:33:18

Но по Москве это 19:33:18

 

У меня такой же вопрос

7 комментариев
Лучший ответ

Добрый день, если вы записываете данные в базу через Entity.Save(), то время конвертируется в UTC автоматически.

При выборке данных

- Через ESQ - получаете в часовом поясе текущего пользователя. Entity.GetTypedColumnValue<DateTime>();

- Через Select - получаете так, как хранится в базе.

 

Касательно вопроса отображения в карточке - проверьте часовой пояс в профиле пользователя и на клиентском ПК.

Если время приходит в JSON и происходит десерриализация, проверьте, какое время вы получаете в режиме отладки.

Добрый день, если вы записываете данные в базу через Entity.Save(), то время конвертируется в UTC автоматически.

При выборке данных

- Через ESQ - получаете в часовом поясе текущего пользователя. Entity.GetTypedColumnValue<DateTime>();

- Через Select - получаете так, как хранится в базе.

 

Касательно вопроса отображения в карточке - проверьте часовой пояс в профиле пользователя и на клиентском ПК.

Если время приходит в JSON и происходит десерриализация, проверьте, какое время вы получаете в режиме отладки.

Пащенко Александр Сергеевич,

есть ли разница в этом случае между 

caseItem.Save(false) и caseItem.Save()?

Пащенко Александр Сергеевич,

 у меня у пользователя часовой пояс стоит время в формате UTC 0. А сохраняет он в другом. Какая функция делает преобразования чп? Где отлаживать?

Отлаживайте код своего сервиса.

Зверев Александр, теперь я там ничего не прибавляю и не вычитаю. Время сохраняется в некорректном поясе. 

причем select getdate() на облаке возвращает время по Киеву

Если нужно чтобы дата при сохранении не конвертировалась в UTC, установите значение Kind в UTC,
например:

var caseEntity = new Case(UserConnection);
caseEntity.SetDefColumnValues();
var yourDateTime = DateTime.Parse("2018-12-25T16:33:18");
yourDateTime = DateTime.SpecifyKind(yourDateTime, DateTimeKind.Utc);
caseEntity.RegisteredOn = yourDateTime;
caseEntity.Save(false);

 

В базе должно храниться по Гринвичу, киевское время — время пользователя, под которым запущена эта серверная логика. Узнать этот пояс можно в свойстве UserConnection.CurrentUser.TimeZone. По идее, преобразовывать должны одинаково оба класса, и ESQ, и Select/Insert/Update.

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

Войдите или зарегистрируйтесь, чтобы комментировать