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