1
votes

Conversion de DateTime UTC en DateHeure locale en C #

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 :


0
votes

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 ().


0 commentaires

3
votes

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.


0 commentaires

0
votes

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);
    }
  }


0 commentaires

1
votes

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 .

Ensuite, en supposant que vous avez maintenant un objet TimeZoneInfo , utilisez simplement la méthode TimeZoneInfo.ConvertTimeFromUtc .


0 commentaires