2015-10-13 3 views
2

У меня есть конечная точка, которая на основе некоторых WSDL получает запросы и строит объект ответа, проблема в том, что у меня есть поле DateTime, которое я должен заполнить значением. Когда я заполняю это значение DateTime.Now то, что я вижу в SoapUI заключается в следующем, что правильно:Как добавить информацию о часовом поясе в DateTime запроса SOAP

2015-10-13T16: 22: 34,2701373 + 02: 00

Между тем, когда я заполняю поле с DateTime, которые извлекаются с помощью логики у меня есть это, что это не так:

2015-10-05T11: 40: 08

Поскольку мне нужно полное информацию, поскольку она возвращается при заполнении DateTime.Now, что отсутствует, и как я могу добавить его к объекту DateTime?

+4

См. 'DateTimeOffset'. – Mitch

+0

https://msdn.microsoft.com/en-us/library/system.datetimeoffset(v=vs.110).aspx –

+0

Или попробуйте установить 'Вид'' DateTime' на локальный – AlexDev

ответ

3

«Использование DateTimeOffset», как правило, хороший совет, но часть проблемы может быть, когда классы автоматически генерируются из WSDL (либо с WCF или .asmx), то xs:DateTime типов в XSD создаются как получить DateTime объектов. Так что - не могу.

К сожалению, для этого не было хорошего решения. Если вы на самом деле пытаетесь использовать DateTimeOffset в своих моделях у источника, WSDL получает странный сложный объект. Если вы попытаетесь просто изменить принимающую сторону, она не может десериализовать xs:DateTime в DateTimeOffset.

Это слабость WCF, SOAP и XSD. Читайте больше в WCF DateTimeOffset compatibility.

Единственными обходными решениями при заполнении данных являются поля DateTime, явно заданные как локальным, так и UTC. Вы можете использовать DateTime.SpecifyKind или любую из функций преобразования, таких как ToLocalTime, ToUniversalTime или аналогичные методы от TimeZoneInfo. Просто будьте очень осторожны, если вы решите использовать местное время, поскольку получение часового пояса с сервера обычно не является отличной идеей. Лучше всего передавать в терминах универсального времени.

Если вы просто заполняете его текущим временем, используйте DateTime.UtcNow. Если вы загружаете базу данных DateTime из UTC, используйте DateTime.SpecifyKind с DateTimeKind.Utc. Если у вас уже есть DateTimeOffset, вы можете использовать свойство .UtcDateTime, чтобы присвоить ему значение DateTime в вашей модели.

Если DateTimeOffset были поддержаны должным образом, то смещение может быть произвольным. Но поскольку это не так, вы ограничены тем, что можете выразить с помощью DateTimeKind.

Смежные вопросы