I have a class that I serialize/deserialize using XmlSerializer
. This class contains a DateTime
field.
When serialized, the DateTime
field is represented by a string that includes the offset from GMT, e.g 2010-05-05T09:13:45-05:00
. When deserialized, these times are converted to the local time of the machine performing the deserialization.
For reasons not worth explaining, I'd like to prevent this timezone conversion from happening. The serialization happens out in the wild, where multiple version of this class exist. The deserialization happens on a server that's under my control. As such, it seems like this would be best handled during deserialization.
How can I make this happen, other than implementing IXmlSerializable
and doing all of the deserialization "by hand?"
DateTime itself contains no real timezone information. It may know if it's UTC or local, but not what local really means. DateTimeOffset is somewhat better - that's basically a UTC time and an offset.
DateTime is in a UTC format.
The ToUniversalTime method converts a DateTime value from local time to UTC. To convert the time in a non-local time zone to UTC, use the TimeZoneInfo. ConvertTimeToUtc(DateTime, TimeZoneInfo) method. To convert a time whose offset from UTC is known, use the ToUniversalTime method.
What I did, it was to use DateTime.SpecifyKind method, as following:
DateTime dateTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified);
And this resolve my problem, I hope this help you.
Instead of parsing as a DateTime
you can parse it as a DateTimeOffset
and use the DateTimeOffset.DateTime
property to ignore the timezone. Like this:
[XmlIgnore()] public DateTime Time { get; set; } [XmlElement(ElementName = "Time")] public string XmlTime { get { return XmlConvert.ToString(Time, XmlDateTimeSerializationMode.RoundtripKind); } set { Time = DateTimeOffset.Parse(value).DateTime; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With