Je souhaite afficher la date et l'heure d'un événement qui sera géré en fonction du fuseau horaire de l'utilisateur. Pour vérifier le fuseau horaire, je change le fuseau horaire de mon système pour un autre fuseau horaire mais mon code obtient toujours le fuseau horaire local. Voici mon code
J'utilise Cassendra Database et C # .NET MVC
DateTime startTimeFormate = x.Startdate; DateTime endTimeFormate = x.Enddate; TimeZone zone = TimeZone.CurrentTimeZone; DateTime startTime = zone.ToLocalTime(startTimeFormate); DateTime endTime = zone.ToLocalTime(endTimeFormate);
4 Réponses :
Selon la documentation MSDN de la propriété TimeZone.CurrentTimeZone , le fuseau horaire local est mis en cache après le premier appel à TimeZone.CurrentTimeZone. En pratique, cela signifie que votre code doit fonctionner correctement tant que les mises à jour dynamiques du fuseau horaire à mi-parcours ne doivent pas être prises en charge. Afin de voir immédiatement les changements, avant d'appeler TimeZone.CurrentTimeZone
, vous devez appeler
TimeZoneInfo.ClearCachedData();
Ceci est documenté dans l'article MSDN comme suit:
Notes aux appelants
Les données du fuseau horaire local sont mises en cache après la première utilisation de CurrentTimeZone récupérer les informations de fuseau horaire. Si le fuseau horaire local du système modifications ultérieures, la propriété CurrentTimeZone ne reflète pas Ce changement. Si vous devez gérer les changements de fuseau horaire pendant que votre l'application est en cours d'exécution, utilisez la classe TimeZoneInfo et appelez son Méthode ClearCachedData ().
Pour convertir le DateHeure UTC
en DateHeure locale
, vous devez utiliser TimeZoneInfo
comme suit:
string userTimeZoneId = "New Zealand Standard Time"; TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(userTimeZoneId); DateTime userLocalDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, userTimeZoneId);
De plus, si vous souhaitez convertir UTC DateTime
en Local DateTime
spécifique à l'utilisateur, procédez comme suit:
DateTime startTimeFormate = x.Startdate; // This is utc date time TimeZoneInfo systemTimeZone = TimeZoneInfo.Local; DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(startTimeFormate, systemTimeZone);
Remarque: TimeZone
dans .NET
est obsolète maintenant et il est obsolète. Utilisez plutôt TimeZoneInfo
.
Ce sont des helpers DateTime que j'utilise et qui couvrent tous les cas dont j'avais besoin jusqu'à présent.
public static class DateTimeHelpers { public static DateTime ConvertToUTC(DateTime dateTimeToConvert, string sourceZoneIdentifier) { TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById(sourceZoneIdentifier); TimeZoneInfo destinationTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC"); return TimeZoneInfo.ConvertTime(dateTimeToConvert, sourceTZ, destinationTZ); } public static DateTime ConvertToTimezone(DateTime utcDateTime, string destinationZoneIdentifier) { TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC"); TimeZoneInfo destinazionTZ = TimeZoneInfo.FindSystemTimeZoneById(destinationZoneIdentifier); return DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(utcDateTime, sourceTZ, destinazionTZ), DateTimeKind.Local); } public static DateTime GetCurrentDateTimeInZone(string destinationZoneIdentifier) { TimeZoneInfo sourceTZ = TimeZoneInfo.FindSystemTimeZoneById("UTC"); TimeZoneInfo destinazionTZ = TimeZoneInfo.FindSystemTimeZoneById(destinationZoneIdentifier); return DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(DateTime.UtcNow, sourceTZ, destinazionTZ), DateTimeKind.Local); } }
TimeZone.CurrentTimeZone
, TimeZoneInfo.Local
et ToLocalTime
utilisent le fuseau horaire local du serveur , et non l'utilisateur final.
À la place, consultez d'abord comment obtenir de manière fiable le fuseau horaire des utilisateurs finaux dans votre code .NET . p >
Ensuite, en supposant que vous avez maintenant un objet TimeZoneInfo
, utilisez simplement la méthode TimeZoneInfo.ConvertTimeFromUtc
.
Copie possible de Comment obtenir le fuseau horaire de l'utilisateur actuel en c # a >
Si vous vous souciez des fuseaux horaires, utilisez au moins
DateTimeOffset
, pasDateTime
. En ce qui concerne votre problème, quelle est la valeurDateTimeKind
pourx.StartDate
etx.EndDate
? Local, UTC ou non spécifié?ToLocalTime
n'a de sens que lorsque vous souhaitez convertir UTC en local. Dans les autres cas, le seul résultat logique est de renvoyer la même valeur datetime avec unDateTimeKind
deLocal
.Si les valeurs proviennent de la base de données, elles sont probablement
Non spécifiées
car le fournisseur de la base de données n'a aucune idée du type de date qu'elles représentent ou du décalage à utiliser.Enfin, pour convertir les valeurs
DateHeure
d'un fuseau horaire à un autre, utilisez TimezoneInfo.ConvertTime