Как сериализовать объекты DateTime в .NET в соответствии со стандартами - PullRequest
7 голосов
/ 15 апреля 2009

Моя цель - использовать объект .NET DateTime (в C #), чтобы он был сериализован и проанализирован из строки (для использования в XML) способом, совместимым со стандартами. Конкретный стандарт, который я имею в виду, - это стандарт ISO 8601 для представления даты и времени.

Я хочу простое в использовании решение (желательно, один вызов метода в каждом направлении) это преобразует в объединенную версию формата. Я также хотел бы сохранить информацию о часовом поясе.

Вот пример строки, которую я хотел бы получить:

2009-04-15T10: 55: 03.0174-05: 00

Моя целевая версия .NET - 3.5.

Я действительно нашел решение этой проблемы несколько лет назад, которое включает в себя пользовательский формат и метод DateTime.ToString (string). Я был удивлен, что более простого решения, соответствующего стандартам, не существует. Использование строки произвольного формата для сериализации и анализа в соответствии со стандартами немного пахнет для меня.

Ответы [ 4 ]

15 голосов
/ 15 апреля 2009

К счастью, есть XmlConvert.ToString() и XmlConvert.ToDateTime(), которые обрабатывают этот формат:

string s = XmlConvert.ToString(DateTime.Now,
     XmlDateTimeSerializationMode.Local);
DateTime dt = XmlConvert.ToDateTime(s,
     XmlDateTimeSerializationMode.Local);

(выберите подходящий режим сериализации)

4 голосов
/ 15 апреля 2009

dateobj.ToString ("s") даст вам строковое представление, совместимое с ISO 8601, которое затем можно десериализовать с помощью DateTime.Parse ()

3 голосов
/ 15 апреля 2009

Похоже, что .NET немного улучшилась в этом отношении за последние несколько лет. Кажется, объект System.Xml.XmlConvert предназначен для удовлетворения целого класса потребностей, возникающих в этом контексте. Следующие функции, по-видимому, предназначены специально для гибкого и совместимого со стандартами преобразования объектов DateTime.

XmlConvert.ToDateTime(string, System.Xml.XmlDateTimeSerializationMode)


XmlConvert.ToString(DateTime, System.Xml.XmlDateTimeSerializationMode)

Следующий элемент перечисления кажется особенно полезным в том случае, если вы хотите сохранить исходную информацию о часовом поясе:

System.Xml.XmlDateTimeSerializationMode.RoundtripKind

Вот ссылки на документацию по функциям MSDN:

XmlConvert.ToDateTime (строка, System.Xml.XmlDateTimeSerializationMode)

XmlConvert.ToString (DateTime, System.Xml.XmlDateTimeSerializationMode)

1 голос
/ 15 апреля 2009

Попробуйте это:

System.Xml.XmlConvert.ToString(TimeStamp, System.Xml.XmlDateTimeSerializationMode.Utc))
...