хотелось бы.
есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель.
в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ).
просто хотелось бы спросить, как это все организовывать правильно принято?
Здравствуйте, nikkit, Вы писали:
N>хотелось бы. N>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель. N>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ). N>просто хотелось бы спросить, как это все организовывать правильно принято?
N>просто хотелось бы спросить, как это все организовывать правильно принято?
Тут два разных момента — как хранить и как передавать.
Как хранить — datetime2 в UTC или DateTimeOffset.
Как передавать — проще всего unix timestamp (long в .NET). Будет максимально крос-платформенно и быстро, т.к. с парсингом строк не нужно заморачиваться.
Если все же передавать строкой — оговорить допустимые форматы (локальное или UTC, с таймзоной или без и т.п.) и настроить сериализатор соответственно.
Здравствуйте, nikkit, Вы писали:
N>просто хотелось бы спросить, как это все организовывать правильно принято?
Контрактом. Мы работаем со временем только в фиксированной оговоренной зоне, как правило UTC.
В локальное переводим только в UI — при отображении или вводе пользователем.
При чём тут сваггер?
Здравствуйте, nikkit, Вы писали:
N>хотелось бы. N>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель. N>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ). N>просто хотелось бы спросить, как это все организовывать правильно принято?
Нет, дата в локальном времени +9 это смещение. Наверное, лучше хранить в utc, чтобы не заморачиваться. Или со смещением. Заморачивоться, конечно, придется.
практичней использовать таймстамп, особенно когда есть внешние (не дот нет) консьюмера для вашего эйпиай. Плюс — учитывайте наличие двух форматов таймстампов seconds & milliseconds) — последний длиннее на 3 символа, плюс если важна поддержка 32 битных клиентов после 2038 года, конечно, не подойдет решение.
Здравствуйте, 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ, Вы писали:
尿Ǥ푙>практичней использовать таймстамп, особенно когда есть внешние (не дот нет) консьюмера для вашего эйпиай. Плюс — учитывайте наличие двух форматов таймстампов seconds & milliseconds) — последний длиннее на 3 символа, плюс если важна поддержка 32 битных клиентов после 2038 года, конечно, не подойдет решение.
Здравствуйте, nikkit, Вы писали:
N>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель. N>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ). N>просто хотелось бы спросить, как это все организовывать правильно принято?
Принято исправлять баги. Твоя строка вполне однозначно определяет время. Никаких проблем в том, что приходит часовой пояс, я не вижу. Даже в Казахстане два часовых пояса, а уж в России — куча. Я твоё объяснение не понял, тебе видней, на каком шаге у тебя значение перестаёт соответствовать реальности.
Здравствуйте, Sharov, Вы писали:
尿Ǥ푙>>практичней использовать таймстамп, особенно когда есть внешние (не дот нет) консьюмера для вашего эйпиай. Плюс — учитывайте наличие двух форматов таймстампов seconds & milliseconds) — последний длиннее на 3 символа, плюс если важна поддержка 32 битных клиентов после 2038 года, конечно, не подойдет решение.
S>А что в 2038 случится?
Некоторые используют для хранения даты 32-битовое целое число со знаком, представляющее собой число секунд с 1970 года. Вот в 2038 году будет переполнение 31 бита, что приведёт к тому, что дата перепрыгнет с 2038 года на 1902 год. Конечно в относительно современных языках этой проблемы нет, там используют больше 32 битов, обычно 64 бита, а их уже хватит на всё с большим запасом.
Р>>Microsoft (R) F# Interactive, версия 12.8.0.0 для F# 8.0 N>оффтоп. может ты пояснишь зачем он нужен?
живой скриптинг, в отличии от C# позволяет писать компактный код, тут же запускать, цветное форматирование вывода.
умеет делать референсы на нугет. практически реплдривендизайн
Периодически пытаюсь заюзать сишарповый репл в студии, но ничего не выходит. плююсь.
Кроме того, как это не смешно, но код на фарше действительно более корректный, и это происходит самом собой
ибо язык форсит юзать определенный стиль. хотя там тоже доступен null, почему-то автоматом приходишь к Option.
ну и так далее.
Р>живой скриптинг, в отличии от C# позволяет писать компактный код, тут же запускать, цветное форматирование вывода. Р>умеет делать референсы на нугет. практически реплдривендизайн
погодь. а чем это лучше линкпада? или я тебя не понял
Р>>живой скриптинг, в отличии от C# позволяет писать компактный код, тут же запускать, цветное форматирование вывода. Р>>умеет делать референсы на нугет. практически реплдривендизайн N>погодь. а чем это лучше линкпада? или я тебя не понял
из коробки dotnet fsi
N>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель. N>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ). N>просто хотелось бы спросить, как это все организовывать правильно принято?
Непонятно, откуда берется это "-9", которое вычитается "непосредственно при записи в базу".
В модель скорее всего действительно пришел UTC, и этой девятки там уже нет (в DateTime её тупо негде хранить) — откуда она снова всплывает?
Я бы еще понял, если время на 3 часа уплывает или на 6 от ожидаемого — тут могут быть проблемы из-за неверного DateTime.Kind, как BlackEric написал.
Возможно, твоё "фигачится в местные настройки +3 час" это вызов .ToLocalTime(), но он не делает НИЧЕГО (если .Kind==Local уже), а при сохранении из-за этого Local оно как бы конвертируется в UTC (-3), то есть уплывает на -6 от твоих ожиданий (но не на -9)?
Или есть еще бизнес-логика в БД (хранимка), которая что-то "знает" о поясе приходящего времени и тупо его корректирует??
В любом случае, в базе логичнее хранить UTC. И поменьше ненужных конверсий при пересылке и хранении (а делать их при отображении).
Здравствуйте, L_G, Вы писали:
N>>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель. N>>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ). N>>просто хотелось бы спросить, как это все организовывать правильно принято?
L_G>Непонятно, откуда берется это "-9", которое вычитается "непосредственно при записи в базу".
"2023-11-01T12:55:00+09:00" — это локал тайм. чтобы utc получить отнимем 9ть
L_G>>Непонятно, откуда берется это "-9", которое вычитается "непосредственно при записи в базу".
Р>"2023-11-01T12:55:00+09:00" — это локал тайм. чтобы utc получить отнимем 9ть
да, и это происходит при десериализации джейсона из запроса В МОДЕЛЬ (DateTime).
вопрос же — откуда девятка может взяться "непосредственно при записи в базу" уже ИЗ МОДЕЛИ
Здравствуйте, L_G, Вы писали: L_G>да, и это происходит при десериализации джейсона из запроса В МОДЕЛЬ (DateTime).
Именно. Должен получиться new DateTime(2023,11,1, 3,55,00, DateTimeKind.Utc). L_G>вопрос же — откуда девятка может взяться "непосредственно при записи в базу" уже ИЗ МОДЕЛИ
Мы не узнаем, пока ТС не приведёт определение модели, и, быть может, рантайм-значения из отладчика.
Возможно, у него там DateTimeOffset, в который уезжают те самые +9:00, и потом повторно вычитаются.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.