Сериализация DateTime по времени без миллисекунд и gmt

Я создал файл класса C #, используя XSD-файл в качестве входных данных. Одно из моих свойств выглядит так:

 private System.DateTime timeField;

 [System.Xml.Serialization.XmlElementAttribute(DataType="time")]
 public System.DateTime Time {
     get {
         return this.timeField;
     }
     set {
         this.timeField = value;
     }
 }

После сериализации содержимое файла теперь выглядит так:

<Time>14:04:02.1661975+02:00</Time>

Возможно ли с XmlAttributes в свойстве, чтобы он отображался без миллисекунд и такого значения GMT?

<Time>14:04:02</Time>

Возможно ли это, или мне нужно собрать какой-то xsl / xpath-replace-magic после того, как класс был сериализован?

Это не решение для изменения объекта на String, потому что он используется как DateTime в остальной части приложения и позволяет нам создавать xml-представление из объекта с помощью метода XmlSerializer.Serialize ().

Причина, по которой мне нужно удалить лишнюю информацию из поля, заключается в том, что принимающая система не соответствует стандартам w3c для типа данных time.


person Espo    schedule 19.09.2008    source источник
comment
Посмотрите на stackoverflow.com/questions/3534525/   -  person TNT    schedule 13.01.2017


Ответы (2)


Вы можете создать строковое свойство, которое выполняет перевод в / из вашего поля timeField и поместить на него атрибут сериализации вместо реального свойства DateTime, которое использует остальная часть приложения.

person Jeffrey L Whitledge    schedule 19.09.2008
comment
Сегодня я должен был сделать то же самое :) - person leppie; 19.09.2008
comment
Будет ли это работать, если позже нам понадобится десериализовать тот же файл? - person Espo; 19.09.2008
comment
Вот как я это решил. Я мог принять оба ответа, но Джеффри был первым. Лучшее, что я могу сделать, это проголосовать за :) - person Espo; 19.09.2008
comment
если ваш XSD не изменится, я думаю, что это самое простое решение. - person parameter; 31.07.2019

Поместите [XmlIgnore] в свойство Time.

Затем добавьте новое свойство:

[XmlElement(DataType="string",ElementName="Time")]
public String TimeString
{
    get { return this.timeField.ToString("yyyy-MM-dd"); }
    set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); }
}
person Matt Howells    schedule 19.09.2008
comment
"yyyy-MM-dd" - это правильная строка формата для поля времени? Хотя это решение не сработало для меня из коробки, оно привело меня к тому, что сработало. Мне пришлось использовать "HH:mm:ss", и я получил из моего dateField вот так get { return this.dateField.ToString("HH:mm:ss"); } - person OutstandingBill; 18.05.2017
comment
То же самое и с типом данных Uri. Это была моя проблема, и вот как я ее исправил. [JsonIgnore] [XmlIgnore] общедоступный Uri UrlIgnore {получить; набор; } [JsonProperty (url)] [XmlElement] общедоступная строка Url {get {return Convert.ToString (UrlIgnore); } установить {UrlIgnore = новый Uri (значение); }} - person fluidguid; 01.11.2018