Tout d'abord, il vérifie si l' Kind
de la DateTime
est connu pour être UTC déjà. Si oui, il retourne la même valeur.
Sinon, c'est supposé être un local du temps au local de l'ordinateur, il est exécuté sur, et en particulier dans la zone de temps que l'ordinateur a été utilisé lorsque certains de la propriété privée a d'abord été initialisées. Cela signifie que si vous modifiez le fuseau horaire après que votre application a été commencé, il ya une bonne chance qu'il sera toujours à l'aide de l'ancien.
Le fuseau horaire contient suffisamment d'information pour convertir une, heure locale, à une heure UTC ou vice-versa, bien qu'il y a des fois que c'est ambigu ou non valide. (Il y a des fois qui se produisent deux fois, et l'heure locale qui ne peut se produire en raison de l'heure d'été.) Les règles de gestion de ces cas sont spécifiés dans la documentation:
Si la date et l'heure de l'instance de la valeur est
l'ambiguïté du temps, cette méthode suppose
que c'est un standard de temps. (Un
ambigu que le temps est un qui permet de cartographier les
soit à un moment précis ou à une
l'heure d'été à l'heure locale
zone) Si la date et l'heure de l'instance
la valeur est invalide le temps, cette méthode
simplement soustrait de l'heure locale de
le fuseau horaire est UTC offset
de retour de l'UTC. (Une heure non valide est un
qui n'existe pas en raison de la
l'application de l'heure d'été
règles d'ajustement.)
La valeur retournée aura un Kind
de DateTimeKind.Utc
, donc si vous appelez ToUniveralTime
sur de ne pas appliquer le décalage de nouveau. (C'est une grande amélioration par rapport .NET 1.1!)
Si vous voulez un non-locale, fuseau horaire, vous devez utiliser TimeZoneInfo
qui a été introduit dans .NET 3.5 (il y a hacky solutions pour les versions antérieures, mais ils ne sont pas sympa). Pour représenter un instant dans le temps, vous devriez envisager d'utiliser DateTimeOffset
qui a été introduit dans .NET 2.0SP1, .NET3.0SP1 et .NET 3.5. Cependant, ce n'est pas pour avoir un temps réel de la zone associée avec juste un décalage de l'heure UTC. Cela signifie que vous ne savez pas à quelle heure locale sera d'une heure plus tard, par exemple -, les règles d'heure d'été peut varier entre les fuseaux horaires qui s'est passé à utiliser le même décalage pour l'instant. TimeZoneInfo
est conçu pour prendre historiques et futures règles en compte, par opposition à l' TimeZone
ce qui est un peu simpliste.
Fondamentalement, le soutien dans .NET 3.5 est beaucoup mieux qu'il ne l'était, mais laisse encore à désirer pour un bon calendrier de l'arithmétique. Tout le monde envie de portage Joda Time pour .NET? ;)