18 votes

Comment convertir l'heure entre les fuseaux horaires (UTC à EDT) ?

Je dois avoir une fonction commune pour convertir l'heure UTC en EDT. J'ai un serveur en Inde. Une application installée dessus doit utiliser l'heure EDT pour tous les besoins horaires.

Je suis en train d'utiliser .NET 3.5.

J'ai trouvé ceci sur un autre forum.

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
        DateTime.UtcNow, "Eastern Standard Time");

Quand j'ai essayé avec "Eastern Daylight Time", j'ai reçu une erreur.

"L'identifiant de fuseau horaire 'Eastern Daylight Time' n'a pas été trouvé sur l'ordinateur local".

S'il vous plaît aidez-moi avec cela ou avec toute autre solution.

38voto

Jon Skeet Points 692016

Eastern Daylight Time n'est pas le nom d'un fuseau horaire "complet" - c'est "la moitié" d'un fuseau horaire, en fait, toujours 4 heures derrière l'UTC. (Il peut exister un terme approprié pour cela, mais je n'en suis pas conscient.)

Pourquoi voudriez-vous utiliser l'EDT pour des heures où l'heure d'été n'est pas appliquée ? Si vous voulez un fuseau horaire personnalisé qui a toujours le même décalage par rapport à l'UTC, utilisez TimeZoneInfo.CreateCustomTimeZone.

Notez que si vous utilisez le fuseau horaire de l'Est standard (TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), alors l'heure d'été sera quand même appliquée correctement (c'est-à-dire pendant l'été).

Par exemple :

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

// Affiche True
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 6, 1)));
// Affiche False
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 1, 1)));

2voto

ChrisBD Points 5795

Je dirais que vous devriez utiliser UTC pour les calculs de périodes de temps, afin d'éviter les problèmes liés au passage à l'heure d'été, puis utiliser LocalTime uniquement pour l'affichage.

DateTime.ToLocalTime pour convertir de l'UTC à l'heure locale, puis DateTime.ToUniversalTime pour convertir de l'heure locale à l'UTC.

Édition après le commentaire 1

Est-ce que je comprends donc que vous voulez afficher un fuseau horaire différent de celui du serveur ?

Si vous utilisez des pages web pour accéder à votre serveur, utilisez HttpRequest.UserLanguages pour créer un objet CultureInfo et l'utiliser pour analyser votre objet DateTime. Consultez ici pour une explication détaillée : Lien de Microsoft sur l'affichage de l'heure locale de l'utilisateur pour les pages web.

Si vous utilisez une architecture client-serveur, alors si l'appel LocalTime est du côté du client, il affichera l'heure locale pour le client. Ensuite, vous la convertissez en UTC pour renvoyer à votre serveur.

De toute façon, votre serveur n'a pas besoin de savoir où se trouve le client. Ainsi, si vous avez plusieurs clients dans plusieurs fuseaux horaires, toutes les calculs correspondront. Cela vous permettra également d'afficher les heures dans n'importe quel fuseau horaire que vous souhaitez en utilisant différents objets Culture.

Édition 2 copiée de mon deuxième commentaire

Vous pouvez obtenir des données horaires au format UTC depuis le serveur. Ensuite, vous pouvez les convertir en utilisant DateTime.ToLocalTime ou DateTime.ToUniversalTime comme requis. Si vous incluez également des dates et devez gérer par exemple les formats US MM/jj/aaaa et européen jj/MM/aaaa, alors vous pouvez utiliser la classe CultureInfo pour analyser la valeur DateTime en conséquence. Cela semble être plus de travail que ce que vous avez actuellement, mais cela signifierait que si vous déplacez à nouveau votre serveur, vous n'aurez pas besoin de recoder la manipulation des DateTime.

Un nouveau point

Un autre point à considérer est la synchronisation des horloges entre le serveur et les clients en utilisant NTP (Network Time Protocol) ou SNTP (Simple Network Time Protocol) si c'est suffisamment précis. Je ne sais pas quel système d'exploitation vous utilisez, mais cela est utilisé par les services temporels de Windows Server pour synchroniser les réseaux.

0voto

Robert L Points 982

La méthode du cow-boy consiste à prendre l'heure UTC, soustraire quatre heures de secondes (le décalage horaire), la formater en utilisant une fonction de formatage UTC, et y apposer une étiquette "EDT".

Si vous avez besoin d'utiliser l'heure d'été parfois et l'heure normale d'autres fois, créez soit une table de recherche des dates de changement, soit utilisez une fonction de calendrier.

-1voto

Andrew Gale Points 41

TimeZoneInfo.ConvertTimeFromUtc aura le décalage correct en fonction de la date et de l'heure que vous lui fournissez. Par exemple :

3AM UTC/11PM HE (décalage de 4 heures) :

DateTime timeSummerET = TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime("08/01/2019 03:00:00"), zoneET);

3AM UTC/10PM HE (décalage de 5 heures) :

DateTime timeWinterET = TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime("12/01/2019 03:00:00"), zoneET);

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