swagger best practice
От: nikkit  
Дата: 01.11.23 14:24
Оценка: -1
хотелось бы.
есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель.
в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ).
просто хотелось бы спросить, как это все организовывать правильно принято?
Re: swagger best practice
От: IT Россия linq2db.com
Дата: 01.11.23 14:47
Оценка:
Здравствуйте, nikkit, Вы писали:

N>просто хотелось бы спросить, как это все организовывать правильно принято?


В SQL Server есть специально обученный тип DateTimeOffset.
Если нам не помогут, то мы тоже никого не пощадим.
Re: swagger best practice
От: BlackEric http://black-eric.lj.ru
Дата: 01.11.23 15:50
Оценка:
Здравствуйте, nikkit, Вы писали:

N>хотелось бы.

N>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель.
N>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ).
N>просто хотелось бы спросить, как это все организовывать правильно принято?

DateTime.Kind Свойство нужно выставлять при переносе данных из requesta в dto
https://github.com/BlackEric001
Re: swagger best practice
От: RushDevion Россия  
Дата: 01.11.23 16:03
Оценка:
N>просто хотелось бы спросить, как это все организовывать правильно принято?

Тут два разных момента — как хранить и как передавать.

Как хранить — datetime2 в UTC или DateTimeOffset.
Как передавать — проще всего unix timestamp (long в .NET). Будет максимально крос-платформенно и быстро, т.к. с парсингом строк не нужно заморачиваться.
Если все же передавать строкой — оговорить допустимые форматы (локальное или UTC, с таймзоной или без и т.п.) и настроить сериализатор соответственно.
Re: swagger best practice
От: Xander Zerge Россия www.zerge.com
Дата: 01.11.23 20:35
Оценка: +4
Здравствуйте, nikkit, Вы писали:

N>просто хотелось бы спросить, как это все организовывать правильно принято?

Контрактом. Мы работаем со временем только в фиксированной оговоренной зоне, как правило UTC.
В локальное переводим только в UI — при отображении или вводе пользователем.
При чём тут сваггер?
Серёжа Новиков,
программист
Re: swagger best practice
От: Разраб  
Дата: 02.11.23 02:10
Оценка:
Здравствуйте, nikkit, Вы писали:

N>хотелось бы.

N>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель.
N>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ).
N>просто хотелось бы спросить, как это все организовывать правильно принято?

Нет, дата в локальном времени +9 это смещение. Наверное, лучше хранить в utc, чтобы не заморачиваться. Или со смещением. Заморачивоться, конечно, придется.

Microsoft (R) F# Interactive, версия 12.8.0.0 для F# 8.0
© Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

Для получения справки введите #help;;

> open System;;
> let json = "2023-11-01T12:55:00+09:00";;
val json: string = "2023-11-01T12:55:00+09:00"

> open System.Globalization;;
> let date = DateTimeOffset.ParseExact(json, [| "yyyy-MM-ddTHH:mm:ss zzz" |], CultureInfo.InvariantCulture.DateTimeFor
mat,  DateTimeStyles.AllowWhiteSpaces);;
val date: DateTimeOffset = 01.11.2023 12:55:00 +09:00

> date.ToLocalTime();;
val it: DateTimeOffset =
  01.11.2023 10:55:00 +07:00 {Date = 01.11.2023 0:00:00;
                              DateTime = 01.11.2023 10:55:00;
                              Day = 1;
                              DayOfWeek = Wednesday;
                              DayOfYear = 305;
                              Hour = 10;
                              LocalDateTime = 01.11.2023 10:55:00;
                              Microsecond = 0;
                              Millisecond = 0;
                              Minute = 55;
                              Month = 11;
                              Nanosecond = 0;
                              Offset = 07:00:00;
                              Second = 0;
                              Ticks = 638344329000000000L;
                              TimeOfDay = 10:55:00;
                              TotalOffsetMinutes = 420;
                              UtcDateTime = 01.11.2023 3:55:00;
                              UtcTicks = 638344077000000000L;
                              Year = 2023;}

> date;;
val it: DateTimeOffset =
  01.11.2023 12:55:00 +09:00 {Date = 01.11.2023 0:00:00;
                              DateTime = 01.11.2023 12:55:00;
                              Day = 1;
                              DayOfWeek = Wednesday;
                              DayOfYear = 305;
                              Hour = 12;
                              LocalDateTime = 01.11.2023 10:55:00;
                              Microsecond = 0;
                              Millisecond = 0;
                              Minute = 55;
                              Month = 11;
                              Nanosecond = 0;
                              Offset = 09:00:00;
                              Second = 0;
                              Ticks = 638344401000000000L;
                              TimeOfDay = 12:55:00;
                              TotalOffsetMinutes = 540;
                              UtcDateTime = 01.11.2023 3:55:00;
                              UtcTicks = 638344077000000000L;
                              Year = 2023;}

> date.ToUniversalTime();;
val it: DateTimeOffset =
  01.11.2023 3:55:00 +00:00 {Date = 01.11.2023 0:00:00;
                             DateTime = 01.11.2023 3:55:00;
                             Day = 1;
                             DayOfWeek = Wednesday;
                             DayOfYear = 305;
                             Hour = 3;
                             LocalDateTime = 01.11.2023 10:55:00;
                             Microsecond = 0;
                             Millisecond = 0;
                             Minute = 55;
                             Month = 11;
                             Nanosecond = 0;
                             Offset = 00:00:00;
                             Second = 0;
                             Ticks = 638344077000000000L;
                             TimeOfDay = 03:55:00;
                             TotalOffsetMinutes = 0;
                             UtcDateTime = 01.11.2023 3:55:00;
                             UtcTicks = 638344077000000000L;
                             Year = 2023;}

>
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: swagger best practice
От: 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒  
Дата: 02.11.23 11:04
Оценка:
практичней использовать таймстамп, особенно когда есть внешние (не дот нет) консьюмера для вашего эйпиай. Плюс — учитывайте наличие двух форматов таймстампов seconds & milliseconds) — последний длиннее на 3 символа, плюс если важна поддержка 32 битных клиентов после 2038 года, конечно, не подойдет решение.
Отредактировано 02.11.2023 12:12 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒ . Предыдущая версия .
Re[2]: 2038
От: Sharov Россия  
Дата: 03.11.23 21:26
Оценка:
Здравствуйте, 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒, Вы писали:

尿Ǥ푙>практичней использовать таймстамп, особенно когда есть внешние (не дот нет) консьюмера для вашего эйпиай. Плюс — учитывайте наличие двух форматов таймстампов seconds & milliseconds) — последний длиннее на 3 символа, плюс если важна поддержка 32 битных клиентов после 2038 года, конечно, не подойдет решение.


А что в 2038 случится?
Кодом людям нужно помогать!
Re: swagger best practice
От: vsb Казахстан  
Дата: 03.11.23 23:48
Оценка: +1
Здравствуйте, nikkit, Вы писали:

N>есть апишка. в контроллере сериализуется стандартным сериализатором из джейсона в модель.

N>в джейсоне присутствует дата. пришел баг. в джейсоне присылают "DateStart":"2023-11-01T12:55:00+09:00". в результате, как я понял дата внутри приходит в ютц — становится -9 часов, а потом фигачится в местные настройки +3 часа (в моем случае). из-за этого в базу прет левак — там по ходу получается что еще раз происходит вычитание -9 непосредственно при записи в базу (мопед не мой, если что ).
N>просто хотелось бы спросить, как это все организовывать правильно принято?

Принято исправлять баги. Твоя строка вполне однозначно определяет время. Никаких проблем в том, что приходит часовой пояс, я не вижу. Даже в Казахстане два часовых пояса, а уж в России — куча. Я твоё объяснение не понял, тебе видней, на каком шаге у тебя значение перестаёт соответствовать реальности.
Re[3]: 2038
От: vsb Казахстан  
Дата: 03.11.23 23:51
Оценка: 12 (1)
Здравствуйте, Sharov, Вы писали:

尿Ǥ푙>>практичней использовать таймстамп, особенно когда есть внешние (не дот нет) консьюмера для вашего эйпиай. Плюс — учитывайте наличие двух форматов таймстампов seconds & milliseconds) — последний длиннее на 3 символа, плюс если важна поддержка 32 битных клиентов после 2038 года, конечно, не подойдет решение.


S>А что в 2038 случится?


Некоторые используют для хранения даты 32-битовое целое число со знаком, представляющее собой число секунд с 1970 года. Вот в 2038 году будет переполнение 31 бита, что приведёт к тому, что дата перепрыгнет с 2038 года на 1902 год. Конечно в относительно современных языках этой проблемы нет, там используют больше 32 битов, обычно 64 бита, а их уже хватит на всё с большим запасом.
Re[2]: swagger best practice
От: nikkit  
Дата: 04.11.23 00:41
Оценка:
Р>Microsoft (R) F# Interactive, версия 12.8.0.0 для F# 8.0
оффтоп. может ты пояснишь зачем он нужен?
Re[3]: swagger best practice
От: Разраб  
Дата: 04.11.23 02:26
Оценка: 2 (1)
Здравствуйте, nikkit, Вы писали:


Р>>Microsoft (R) F# Interactive, версия 12.8.0.0 для F# 8.0

N>оффтоп. может ты пояснишь зачем он нужен?
живой скриптинг, в отличии от C# позволяет писать компактный код, тут же запускать, цветное форматирование вывода.
умеет делать референсы на нугет. практически реплдривендизайн
Периодически пытаюсь заюзать сишарповый репл в студии, но ничего не выходит. плююсь.
Кроме того, как это не смешно, но код на фарше действительно более корректный, и это происходит самом собой
ибо язык форсит юзать определенный стиль. хотя там тоже доступен null, почему-то автоматом приходишь к Option.
ну и так далее.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: swagger best practice
От: nikkit  
Дата: 04.11.23 05:39
Оценка:
Р>живой скриптинг, в отличии от C# позволяет писать компактный код, тут же запускать, цветное форматирование вывода.
Р>умеет делать референсы на нугет. практически реплдривендизайн
погодь. а чем это лучше линкпада? или я тебя не понял
Re[5]: swagger best practice
От: Разраб  
Дата: 04.11.23 12:20
Оценка: 2 (1)
Здравствуйте, nikkit, Вы писали:


Р>>живой скриптинг, в отличии от C# позволяет писать компактный код, тут же запускать, цветное форматирование вывода.

Р>>умеет делать референсы на нугет. практически реплдривендизайн
N>погодь. а чем это лучше линкпада? или я тебя не понял
из коробки dotnet fsi
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: swagger best practice
От: L_G Россия  
Дата: 06.11.23 11:48
Оценка: +1
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. И поменьше ненужных конверсий при пересылке и хранении (а делать их при отображении).
Каша в голове — пища для ума (с)
Re[2]: swagger best practice
От: Разраб  
Дата: 07.11.23 01:12
Оценка:
Здравствуйте, 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ть
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: swagger best practice
От: L_G Россия  
Дата: 07.11.23 13:35
Оценка: +1
L_G>>Непонятно, откуда берется это "-9", которое вычитается "непосредственно при записи в базу".

Р>"2023-11-01T12:55:00+09:00" — это локал тайм. чтобы utc получить отнимем 9ть


да, и это происходит при десериализации джейсона из запроса В МОДЕЛЬ (DateTime).

вопрос же — откуда девятка может взяться "непосредственно при записи в базу" уже ИЗ МОДЕЛИ
Каша в голове — пища для ума (с)
Re[4]: swagger best practice
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.11.23 03:40
Оценка:
Здравствуйте, L_G, Вы писали:
L_G>да, и это происходит при десериализации джейсона из запроса В МОДЕЛЬ (DateTime).
Именно. Должен получиться new DateTime(2023,11,1, 3,55,00, DateTimeKind.Utc).
L_G>вопрос же — откуда девятка может взяться "непосредственно при записи в базу" уже ИЗ МОДЕЛИ
Мы не узнаем, пока ТС не приведёт определение модели, и, быть может, рантайм-значения из отладчика.
Возможно, у него там DateTimeOffset, в который уезжают те самые +9:00, и потом повторно вычитаются.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.