.NET Framework : Convert Datetime to specific Timezone with DaylightSavingTime support

La gestion des dates et surtout des horaires dans un site multinational est très importante. Il faudrait se baser sur API systèmes pour ne pas recoder toutes les règles et “réinventer la roue”. Le Framework .NET fourni une classe système permettant de gérer les informations des zones horaires :

// Type: System.TimeZoneInfo
// Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 255ABCDF-D9D6-4E3D-BAD4-F74D4CE3D7A8
// Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
namespace System
{
public sealed class TimeZoneInfo : IEquatable<TimeZoneInfo>, ISerializable, IDeserializationCallback
{
//...
}
}

Donc il ne faut pas hésiter à l’utiliser. Voici quelques utilisations :

 
var dt = DateTime.Now;
// Display local datetime
Console.Out.WriteLine(dt);
// Display correspondant datetime in (UTC-05:00) Est (USA. and Canada) 
Console.Out.WriteLine(TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")));
// Display correspondant datetime in (UTC+01:00) Bruxelles, Copenhague, Madrid, Paris
Console.Out.WriteLine(TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")));

==>

 
20/03/2015 15:26:10
20/03/2015 10:26:10
20/03/2015 15:26:10

Il faudrait aussi si vous persistez des dates dans une base de données qu’elle soit au format UTC. Pour convertir ces dates UTC au format attendu voici quelques exemples. J’ai pris exprès l’exemple de quelques dates de mars pour montrer la prise en charge automatique du passage à l’heure d’été décalé entre les USA et la France.

	Console.Out.WriteLine("--------- DaylightSavingTime ON in USA and OFF in France");
	var dt = new DateTime(2005,03,25,15,00,00);
	Console.Out.WriteLine(dt);
	Console.Out.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")));
	Console.Out.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")));
	
	Console.Out.WriteLine("--------- DaylightSavingTime ON in USA and ON France");
	dt = new DateTime(2005,03,29,15,00,00);
	Console.Out.WriteLine(dt);
	Console.Out.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")));
	Console.Out.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time")));

==>

 
--------- DaylightSavingTime ON in USA and OFF in France
25/03/2005 15:00:00
25/03/2005 10:00:00
25/03/2005 16:00:00
--------- DaylightSavingTime ON in USA and ON France
29/03/2005 15:00:00
29/03/2005 10:00:00
29/03/2005 17:00:00

Pour avoir la liste complète des TimeZone gérés

var lst = TimeZoneInfo.GetSystemTimeZones();

SystemTimeZones

IdDisplay NameStandard NameDaylight NameBase UtcOffsetSupports Daylight SavingTime
Dateline Standard Time(UTC-12:00) Ligne de date internationale (Ouest)Changement de dateChangemt de date (heure d’été)-12:00:00False
UTC-11(UTC-11:00) Temps universel coordonné-11UTC-11UTC-11-11:00:00False
Hawaiian Standard Time(UTC-10:00) HawaiiHawaiiHawaii (heure d’été)-10:00:00False
Alaskan Standard Time(UTC-09:00) AlaskaAlaskaAlaska (heure d’été)-09:00:00True
Pacific Standard Time (Mexico)(UTC-08:00) Basse CaliforniePacifique (Mexique)Pacifique (h. d’été, Mexique)-08:00:00True
Pacific Standard Time(UTC-08:00) Pacifique (É.-U. et Canada)PacifiquePacifique (heure d’été)-08:00:00True
US Mountain Standard Time(UTC-07:00) ArizonaRocheuses - É.-U.Rocheuses - É.-U. (heure d’été)-07:00:00False
Mountain Standard Time (Mexico)(UTC-07:00) Chihuahua, La Paz, MazatlanMontagnes (Mexique)Montagne (heure d’été, Mexique)-07:00:00True
Mountain Standard Time(UTC-07:00) Montagnes Rocheuses (É.-U. et Canada)RocheusesRocheuses (heure d’été)-07:00:00True
Central America Standard Time(UTC-06:00) Amérique centraleAmérique centraleAmérique centrale (heure d’été)-06:00:00False
Central Standard Time(UTC-06:00) Centre (É.-U. et Canada)CentreCentre (heure d’été)-06:00:00True
Central Standard Time (Mexico)(UTC-06:00) Guadalajara, Mexico, MonterreyCentre (Mexique)Centre (heure d’été, Mexique)-06:00:00True
Canada Central Standard Time(UTC-06:00) SaskatchewanCanada CentreCanada Centre (heure d’été)-06:00:00False
SA Pacific Standard Time(UTC-05:00) Bogota, Lima, Quito, Rio BrancoAmér. du Sud - Pac.Amér. du Sud, Pac.(heure d’été)-05:00:00False
Eastern Standard Time(UTC-05:00) Est (É.-U. et Canada)EstEst (heure d’été)-05:00:00True
US Eastern Standard Time(UTC-05:00) Indiana (Est)Est (É.-U.)Est (É.-U. - heure d’été)-05:00:00True
Venezuela Standard Time(UTC-04:30) CaracasVenezuelaVenezuela (heure d’été)-04:30:00False
Paraguay Standard Time(UTC-04:00) AsunciónParaguayParaguay (heure d’été)-04:00:00True
Central Brazilian Standard Time(UTC-04:00) CuiabaBrésil CentreBrésil Centre (heure d’été)-04:00:00True
SA Western Standard Time(UTC-04:00) Georgetown, La Paz, Manaus, San JuanAmér. du Sud occid.Amér. du Sud occid. (heure été)-04:00:00False
Atlantic Standard Time(UTC-04:00) Heure Atlantique (Canada)AtlantiqueAtlantique (heure d’été)-04:00:00True
Pacific SA Standard Time(UTC-04:00) SantiagoAmér. du Sud PacifAmér. du Sud Pacif(heure d’été)-04:00:00True
Newfoundland Standard Time(UTC-03:30) Terre-Neuve-et-LabradorTerre-Neuve-et-LabradorTerre-Neuve (heure d’été)-03:30:00True
E. South America Standard Time(UTC-03:00) BrasiliaAmér. du Sud - EstAmér. du Sud, Est (heure d’été)-03:00:00True
Argentina Standard Time(UTC-03:00) Buenos AiresArgentineArgentine (heure d’été)-03:00:00True
SA Eastern Standard Time(UTC-03:00) Cayenne, FortalezaAmér. du Sud orien.Amér. du Sud orien(heure d’été)-03:00:00False
Greenland Standard Time(UTC-03:00) GroenlandGroenlandGroenland (heure d’été)-03:00:00True
Montevideo Standard Time(UTC-03:00) MontevideoMontevideoMontevideo (heure d’été)-03:00:00True
Bahia Standard Time(UTC-03:00) SalvadorBahiaBahia (heure d'été)-03:00:00True
Mid-Atlantic Standard Time(UTC-02:00) Centre-Atlantique - AncienCentre-AtlantiqueCentre-Atlantique (heure d’été)-02:00:00True
UTC-02(UTC-02:00) Temps universel coordonné-02UTC-02UTC-02-02:00:00False
Azores Standard Time(UTC-01:00) Les AçoresLes AçoresLes Açores (heure d’été)-01:00:00True
Cape Verde Standard Time(UTC-01:00) Îles du Cap-VertCap-VertCap-Vert (heure d’été)-01:00:00False
Morocco Standard Time(UTC) CasablancaMarocMaroc (heure d’été)00:00:00True
GMT Standard Time(UTC) Dublin, Édimbourg, Lisbonne, LondresGMTGMT (heure d’été)00:00:00True
Greenwich Standard Time(UTC) Monrovia, ReykjavikGreenwichGreenwich (heure d’été)00:00:00False
UTC(UTC) Temps universel coordonnéTemps universel coordonnéTemps universel coordonné00:00:00False
W. Central Africa Standard Time(UTC+01:00) Afrique centrale - OuestAfr. centrale OuestAfr. centrale O. (heure d’été)01:00:00False
W. Europe Standard Time(UTC+01:00) Amsterdam, Berlin, Berne, Rome, Stockholm, VienneEurope de l’OuestEurope de l’Ouest (heure d’été)01:00:00True
Central Europe Standard Time(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, PragueEurope centraleEurope centrale (heure d’été)01:00:00True
Romance Standard Time(UTC+01:00) Bruxelles, Copenhague, Madrid, ParisParis, MadridParis, Madrid (heure d’été)01:00:00True
Central European Standard Time(UTC+01:00) Sarajevo, Skopje, Varsovie, ZagrebCentre de l’EuropeEurope centrale - heure d’été01:00:00True
Namibia Standard Time(UTC+01:00) WindhoekNamibieNamibie (heure d’été)01:00:00True
Jordan Standard Time(UTC+02:00) AmmanJordanieJordanie (heure d’été)02:00:00True
GTB Standard Time(UTC+02:00) Athènes, BucarestGTBGTB (heure d’été)02:00:00True
Middle East Standard Time(UTC+02:00) BeyrouthMoyen-OrientMoyen-Orient (heure d’été)02:00:00True
Syria Standard Time(UTC+02:00) DamasSyrieSyrie (heure d'été)02:00:00True
E. Europe Standard Time(UTC+02:00) Europe de l’EstEurope de l’EstEurope de l’Est (heure d’été)02:00:00True
South Africa Standard Time(UTC+02:00) Harare, PretoriaAfrique du SudAfrique du Sud (heure d’été)02:00:00False
FLE Standard Time(UTC+02:00) Helsinki, Kiev, Riga, Sofia, Tallinn, VilniusFLEFLE (heure d’été)02:00:00True
Turkey Standard Time(UTC+02:00) IstanbulTurquieTurquie (heure d’été)02:00:00True
Israel Standard Time(UTC+02:00) JérusalemJérusalemJérusalem (heure d’été)02:00:00True
Kaliningrad Standard Time(UTC+02:00) Kaliningrad (RTZ 1)Russie TZ 1Russie TZ 1 (heure d’été)02:00:00True
Egypt Standard Time(UTC+02:00) Le CaireÉgypteÉgypte (heure d’été)02:00:00True
Libya Standard Time(UTC+02:00) TripoliLybieLybie (heure d’été)02:00:00True
Arabic Standard Time(UTC+03:00) BagdadArabieArabie (heure d’été)03:00:00True
Arab Standard Time(UTC+03:00) Koweït, RiyadPays arabesPays arabes (heure d’été)03:00:00False
Belarus Standard Time(UTC+03:00) MinskBélarusBélarus (heure d’été)03:00:00True
Russian Standard Time(UTC+03:00) Moscou, Saint-Pétersbourg, Volgograd (RTZ 2)Russie TZ 2Russie TZ 2 (heure d’été)03:00:00True
E. Africa Standard Time(UTC+03:00) NairobiAfrique de l’EstAfrique de l’Est (heure d’été)03:00:00False
Iran Standard Time(UTC+03:30) TéhéranIranIran (heure d’été)03:30:00True
Arabian Standard Time(UTC+04:00) Abu Dhabi, MuscatArabieArabie (heure d’été)04:00:00False
Azerbaijan Standard Time(UTC+04:00) BakouAzerbaïdjanAzerbaïdjan (heure d’été)04:00:00True
Caucasus Standard Time(UTC+04:00) ErevanCaucaseCaucase (heure d’été)04:00:00True
Russia Time Zone 3(UTC+04:00) Izhevsk, Samara (RTZ 3)Russie TZ 3Russie TZ 3 (heure d’été)04:00:00False
Mauritius Standard Time(UTC+04:00) Port LouisÎle MauriceÎle Maurice (heure d’été)04:00:00True
Georgian Standard Time(UTC+04:00) TbilissiGéorgieGéorgie (heure d’été)04:00:00False
Afghanistan Standard Time(UTC+04:30) KaboulAfghanistanAfghanistan (heure d’été)04:30:00False
West Asia Standard Time(UTC+05:00) Achgabat, TachkentAsie de l’OuestAsie de l’Ouest (heure d’été)05:00:00False
Ekaterinburg Standard Time(UTC+05:00) Iekaterinbourg (RTZ 4)Russie TZ 4Russie TZ 4 (heure d’été)05:00:00True
Pakistan Standard Time(UTC+05:00) Islamabad, KarachiPakistanPakistan (heure d’été)05:00:00True
India Standard Time(UTC+05:30) Chennai, Kolkata, Mumbai, New DelhiIndeInde (heure d’été)05:30:00False
Sri Lanka Standard Time(UTC+05:30) Sri JayawardenepuraSri LankaSri Lanka (heure d’été)05:30:00False
Nepal Standard Time(UTC+05:45) KatmandouNépalNépal (heure d’été)05:45:00False
Central Asia Standard Time(UTC+06:00) AstanaAsie centraleAsie centrale (heure d’été)06:00:00False
Bangladesh Standard Time(UTC+06:00) DhakaBangladeshBangladesh (heure d'été)06:00:00True
N. Central Asia Standard Time(UTC+06:00) Novossibirsk (RTZ 5)Russie TZ 5Russie TZ 5 (heure d’été)06:00:00True
Myanmar Standard Time(UTC+06:30) RangoonMyanmarMyanmar (heure d’été)06:30:00False
SE Asia Standard Time(UTC+07:00) Bangkok, Hanoi, DjakartaAsie du Sud-EstAsie du Sud-Est (heure d’été)07:00:00False
North Asia Standard Time(UTC+07:00) Krasnoïarsk (RTZ 6)Russie TZ 6Russie TZ 6 (heure d’été)07:00:00True
China Standard Time(UTC+08:00) Beijing, Chongqing, Hong Kong, UrumqiChineChine (heure d’été)08:00:00False
North Asia East Standard Time(UTC+08:00) Irkoutsk (RTZ 7)Russie TZ 7Russie TZ 7 (heure d’été)08:00:00True
Singapore Standard Time(UTC+08:00) Kuala Lumpur, SingapourMalaisieMalaisie (heure d’été)08:00:00False
Ulaanbaatar Standard Time(UTC+08:00) Oulan-BatorOulan-BatorOulan-Bator (heure d'été)08:00:00False
W. Australia Standard Time(UTC+08:00) PerthAustralie (Ouest)Australie (Ouest) (heure d’été)08:00:00True
Taipei Standard Time(UTC+08:00) TaipeiTaipeiTaipei (heure d’été)08:00:00False
Tokyo Standard Time(UTC+09:00) Osaka, Sapporo, TokyoTokyoTokyo (heure d’été)09:00:00False
Korea Standard Time(UTC+09:00) SéoulCoréeCorée (heure d’été)09:00:00False
Yakutsk Standard Time(UTC+09:00) Yakoutsk (RTZ 8)Russie TZ 8Russie TZ 8 (heure d’été)09:00:00True
Cen. Australia Standard Time(UTC+09:30) AdélaïdeAustralie CentreAustralie Centre (heure d’été)09:30:00True
AUS Central Standard Time(UTC+09:30) DarwinAUS CentreAUS Centre (heure d’été)09:30:00False
E. Australia Standard Time(UTC+10:00) BrisbaneAustralie (Est)Australie (Est) (heure d’été)10:00:00False
AUS Eastern Standard Time(UTC+10:00) Canberra, Melbourne, SydneyAUS (Est)AUS (Est) (heure d’été)10:00:00True
West Pacific Standard Time(UTC+10:00) Guam, Port MoresbyPacifique OuestPacifique Ouest (heure d’été)10:00:00False
Tasmania Standard Time(UTC+10:00) HobartTasmanieTasmanie (heure d’été)10:00:00True
Magadan Standard Time(UTC+10:00) MagadanMagadanMagadan (heure d'été)10:00:00True
Vladivostok Standard Time(UTC+10:00) Vladivostok, Magadan (RTZ 9)Russie TZ 9Russie TZ 9 (heure d’été)10:00:00True
Russia Time Zone 10(UTC+11:00) Chokurdakh (RTZ 10)Russie TZ 10Russie TZ 10 (heure d’été)11:00:00False
Central Pacific Standard Time(UTC+11:00) Îles Salomon, Nouvelle-CalédoniePacifique CentrePacifique Centre (heure d’été)11:00:00False
Russia Time Zone 11(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky (RTZ 11)Russie TZ 11Russie TZ 11 (heure d’été)12:00:00False
New Zealand Standard Time(UTC+12:00) Auckland, WellingtonNouvelle-ZélandeNouvelle-Zélande (heure d’été)12:00:00True
Fiji Standard Time(UTC+12:00) FidjiFidjiFidji (heure d’été)12:00:00True
Kamchatka Standard Time(UTC+12:00) Petropavlovsk-Kamchatsky - AncienKamchatkaKamchatka (heure d’été)12:00:00True
UTC+12(UTC+12:00) Temps universel coordonné+12UTC+12UTC+1212:00:00False
Tonga Standard Time(UTC+13:00) Nuku’alofaTongaTonga (heure d’été)13:00:00False
Samoa Standard Time(UTC+13:00) SamoaSamoa américainesSamoa américaines (heure d’été)13:00:00True
Line Islands Standard Time(UTC+14:00) Kiritimati, ÎleLine, ÎleLine, Île, (heure d’été)14:00:00False

User Rating: 4.45 ( 1 votes)

About Wicem

3 comments

  1. Bonsoir Wicem, merci pour l’article concernant le sujet (.NET Framework). Donc j’aime, je partage sur mon compte Facebook et je tweet sur mon profile twitter de même, pour que tous les gens peuvent le voir. Encore pour la deuxième fois merci.

  2. It’s going to be ending of mine day, but before end I am reading
    this impressive piece of writing to improve my knowledge.

  3. Pretty! Τhis ᴡas ɑn incredibly wonderful post.
    Ꮇany thanks for providing tһiѕ info.

Leave a Reply

Your email address will not be published. Required fields are marked *