88 votes

Comment utiliser TimeZoneInfo pour obtenir l'heure locale pendant l'heure d'été ?

J'essaie d'utiliser DateTimeOffset pour transmettre un moment précis dans le temps, quel que soit le fuseau horaire. Je n'arrive pas à trouver comment utiliser TimeZoneInfo pour gérer l'heure d'été.

var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));

Cela s'imprime :

6/2/2010 4:37:19 PM
6/2/2010 3:37:19 PM -06:00

Je suis dans le fuseau horaire central, et nous sommes actuellement en heure d'été. J'essaie de faire en sorte que la deuxième ligne soit lue :

6/2/2010 4:37:19 PM -05:00

BaseUtcOffset ne change apparemment pas en fonction de l'heure d'été.

Comment puis-je obtenir le bon moment avec la bonne valeur de décalage ?

Merci.

72voto

Paul Kearney - pk Points 3300

Vous devez obtenir l'UtcOffset à partir du TimeZoneInfo, puis le passer à la méthode ToOffset() :

var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));

70voto

Karl Gjertsen Points 147

Vous pouvez également utiliser TimeZoneInfo.ConvertTimeFromUtc, qui tiendra compte de l'heure d'été :

DateTime utc = DateTime.UtcNow;
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X