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?
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:
DateTime
de Kind
est DateTimeKind.Local
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.
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();
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
ou ca:
var localTime = new DateTimeOffset(utcDate,TimeSpan.FromHours(0))
.ToLocalTime().DateTime;