I’ve been working on an application that needs to handle the
case where different users and/or different servers are located in
different time zones. To accommodate this, I figured it would be
best to ensure that all date/time values would be stored and
manipulated in universal time (UTC).

For textual representations of date/time values, I’ve used the
XML canonical format CCYY-MM-DDThh:mm:ssZ, for example
2002-04-20T23:59:07Z. Unfortunately, I had wrongly assumed that
using DateTime.Parse() on such a string would return my UTC

The fact that DateTime.Parse() converted the value to local time
was a bit of a surprise to begin with. The more I think about it,
though, the more sense it makes. Consider these two strings:
“2002-04-20T23:59:07Z” and “2002-04-20T23:59:07”. The first is in
UTC and the second is, well, we don’t know – local time I suppose.
And I guess that’s the key – if the second is parsed and retains
the given hour and we accept that it is in local time, it probably
makes sense that the first is adjusted by the local time zone
offset in order that we can make a comparison between them in a
like for like manner. Just caught me off guard is all. A quick call
to ToUniversalTime() and all is well again.