Есть ли способ гарантировать, что реквизит XML DateTime сериализуется в зимнее время, если дата приходится на зимнее вреC#

Место общения программистов C#
Anonymous
Есть ли способ гарантировать, что реквизит XML DateTime сериализуется в зимнее время, если дата приходится на зимнее вре

Сообщение Anonymous »

XmlSerializer продолжает сериализовать дату и время в летнее время (+2) вместо зимнего времени), если XmlModel имеет свойство с XmlAttrib с конфигурацией «DateType=Time».
Указана дата: 03.07.2024, это должно быть зимнее время (+1)
См. код.
Мой вопрос: есть ли какой-либо способ указать зимнее время в XMLModel или для даты и времени?
Часовой пояс: Брюссель
Код:

Код: Выделить всё

string xmlString = "";
// simulate the mapping from front end to the request
var periodModel = new PeriodModel();
var time = new TimeSpan(19, 0, 0);
var date = new DateTime(2024, 03, 07);
var dateWithTimezone = DateTime.SpecifyKind(date.Date.Add(time), DateTimeKind.Local);
periodModel.EndDate = date;
periodModel.EndTime = dateWithTimezone;

using(var ms = new MemoryStream())
{
var serializer = new XmlSerializer(typeof(PeriodModel));
serializer.Serialize(ms, periodModel);
var bytes = ms.ToArray();

xmlString = System.Text.Encoding.UTF8.GetString(bytes);
}

Assert.NotNull(xmlString);
xmlString.Should().BeEquivalentTo("?");
Модель XML:

Код: Выделить всё

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class PeriodModel
{
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "date")]
public DateTime EndDate { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, DataType = "time")]
public DateTime EndTime { get; set; }
}
Результат (часть):

Код: Выделить всё

19:00:00.0000000+02:00
Ожидаемый результат:

Код: Выделить всё

19:00:00.0000000+01:00
Проблема заключалась в том, что XmlSerializer будет использовать часовой пояс, в котором мы находимся сегодня, а не часовой пояс указанной даты. Решение заключалось в том, чтобы использовать строку вместо даты и времени в модели XML/WCF и позволить DateTime.ToString("") делать это.
Метод DateTime.ToString будет знать, какой часовой пояс выбрать для даты в зимнее время.

Подробнее здесь: https://stackoverflow.com/questions/785 ... ime-if-the

Вернуться в «C#»