#c# #datetime #serialization #servicestack
#c# #datetime #сериализация #servicestack
Вопрос:
Мы используем ServiceStack для наших веб-сервисов, но мы заметили, что любой объект DateTime в запросе DTO изменяется. Часы меняются в зависимости от смещения часового пояса сервера. Допустим, я отправляю запрос с восточного времени на сервер, на котором размещен ServiceStack api в горном часовом поясе, он меняет дату на два часа, как только наш метод api получает запрос.
Я пытался найти, как изменить десериализацию значения datetime с помощью ServiceStack, чтобы предотвратить это, и пока не нашел никакого элегантного решения. Я подумал, что, сделав ServiceStack.Text.JsConfig.AssumeUtc = true;
это, это будет обрабатывать любое значение datetime, поступающее на сервер, как UTC, а не преобразовывать в datetime с каким-то локальным значением. Похоже, это не влияет на поступающие даты.
Я пытался использовать ServiceStack.Text.JsConfig<DateTime>.DeSerializeFn
для изменения строки на datetime, но для этого требуется удалить всю информацию, кроме информации о тике datetime.
Я упускаю что-то очевидное в этом? Похоже, должен быть более простой способ предотвратить такое поведение.
Комментарии:
1. Как выглядят значения по проводам? Я предполагаю, что они находятся в формате ISO601, но имеют ли они конечный Z или смещение? Примерное значение было бы полезно.
Ответ №1:
Скорее всего, вы захотите использовать это вместо:
JsConfig.AlwaysUseUtc = true;
Комментарии:
1. Это полезно, и мне нужно будет запомнить это для последующего использования, потому что я хочу переключиться на использование UTC во всем нашем коде, но пока я должен придерживаться того, как он отправляет без UTC. Я внес изменения и теперь сохраняю фактическое время, но в формате UTC. Мне было интересно, есть ли какой-либо способ сохранить datetime со значением из того, что оно было отправлено, без преобразования его в UTC. Главным образом потому, что значения datetime используются для фильтрации на основе дат для возврата наборов результатов, а даты, хранящиеся в базе данных, не являются UTC.
2. @user1568610 Нет, он всегда сериализуется в UTC по умолчанию и по умолчанию десериализует его по местному времени, но может быть сохранен как UTC с указанным выше параметром конфигурации.
3. Хорошо, спасибо за помощь и информацию. Я просто буду придерживаться пользовательской десериализации, пока не смогу обновить код для использования UTC.