Преобразование даты и времени в неправильный формат (дневной свет?) - PullRequest
1 голос
/ 26 апреля 2019

Я вызываю мыльный веб-сервис, который возвращает XML с датой рождения в следующем формате:

1948-03-13+02:00

У меня также есть вспомогательный класс, который преобразует мой XML в объект, чтобы я мог получить к нему доступ.

Обычно это работает без проблем, но в этом конкретном случае, когда я проверяю значение переменной (переменная DateTime), возвращается

12/03/1948 23.00.00

Кажется, что он удаляет 2 часа, поэтому, когда я сохраняю дату, есть риск, что я сохраню неверную дату.

Может ли быть проблема перехода на летнее время? в Италии в этот период произошла смена дневного света

Вспомогательный класс - это автоматически сгенерированный код, проблема в этом поле:

Private dataRegolarizzazioneField As Date
<System.Xml.Serialization.XmlElementAttribute(Form:=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType:="date")>  _
    Public Property dataRegolarizzazione() As Date
        Get
            Return Me.dataRegolarizzazioneField
        End Get
        Set
            Me.dataRegolarizzazioneField = value
        End Set
    End Property

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

День рождения этого человека был днем ​​перехода на летнее время в 1948 году.

Многие применения типов данных даты / времени выигрывают от тщательной обработки часовых поясов. Это не верно для дат рождения . Подумайте об этом: если ваш день рождения 27 марта и вы родились в Италии и вы путешествуете в Австралию, ваш день рождения 27 марта в Австралии весь день. Чтобы вычислить ваш возраст, мы сравниваем вашу дату рождения с текущей датой по местному времени.

Итак, вам нужно использовать местное время. Уберите смещение часового пояса. Если ваши входные строки последовательно отформатированы, вы можете использовать это.

 const string pattern = 'yyyy-MM-dd';
 datestring = datestring.Substring(0,10);
 DateTime birthdate;
 if (!DateTime.TryParseExact(datestring, 
                             pattern,
                             null,
                             DateTimeStyles.AssumeLocal, 
                             out birthdate)) {
   /* handle date parse error */
 }

Строки формата даты Dotnet здесь .

Если вы храните это в базе данных SQL, используйте тип данных DATE для этого столбца; обычно он не учитывает текущий часовой пояс.

0 голосов
/ 26 апреля 2019

может быть, это не дневной свет. https://docs.microsoft.com/en-us/dotnet/standard/datetime/choosing-between-datetime

когда я работаю со временем и датами, я использую DateTimeOffset, и у меня нет таких проблем. Измените значение на DateTimeOffset, чтобы увидеть, работает ли оно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...