web-dev-qa-db-fra.com

Conversion d'UTC DateTime en DateTime locale

J'ai la méthode de contrôleur ASP.Net MVC suivante:

public ActionResult DoSomething(DateTime utcDate)
{
   var localTime = utcDate.ToLocalTime();
}

Le problème est que localTime aura exactement la même valeur que utcDate. Je suppose que c'est parce que utcDate ne sait pas qu'il a une valeur UTC. Donc, ma question est de savoir comment puis-je convertir utcDate (que je SAIS être UTC) en local?

17
Shane Courtrille

Si vous savez que DateTime contient une valeur UTC, vous pouvez utiliser ce qui suit :

DateTime iKnowThisIsUtc = whatever;
DateTime runtimeKnowsThisIsUtc = DateTime.SpecifyKind(
    iKnowThisIsUtc,
    DateTimeKind.Utc);
DateTime localVersion = runtimeKnowsThisIsUtc.ToLocalTime();

Par exemple, dans mon application actuelle, je crée des horodatages dans ma base de données avec SQL utcnow, mais lorsque je les lis dans mon application C #, la propriété Kind est toujours Unknown. J'ai créé une fonction wrapper pour lire l'horodatage, définir délibérément son Kind sur Utc, puis le convertir en heure locale - essentiellement comme ci-dessus.

Notez que DateTime.ToLocalTime() n'affecte la valeur que si l'un (ou les deux) des éléments suivants est valable:

  • La propriété DateTime de Kind est DateTimeKind.Local
  • Votre fuseau horaire local est tel que "aucun changement" est la conversion correcte

Je pense que nous pouvons supposer que le deuxième point n'est pas vrai. Il semble donc que la propriété iKnowThisIsUtc de Kind est déjà définie sur Local. Vous devez comprendre pourquoi tout ce qui vous fournit ces DateTime pense qu'ils sont locaux.

44
Rawling

comme décrit par MSDN, vous devez que la propriété Kind de votre date soit UTC, pour que ToLocalTime () fonctionne (et convertisse la date en heure locale. http://msdn.Microsoft.com/en-us /library/system.datetime.tolocaltime.aspx

Essaye ça:

utcDate = DateTime.SpecifyKind(utcDate, DateTimeKind.Utc);
var localTime = utcDate.ToLocalTime();
5
tranceporter

Essayez ce qui suit:

public static DateTime UtcToPacific(DateTime dateTime)
        {
            return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
        }

Modifiez évidemment Pacific à votre fuseau horaire local.

Si vous souhaitez savoir quels fuseaux horaires sont présents sur votre machine, consultez le lien suivant: http://msdn.Microsoft.com/en-us/library/bb397781.aspx

4
Robert H

ou ca:

var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
                    .ToLocalTime().DateTime;
1
Yann Olaf