Het omzetten van UTC DateTime om de lokale Datum en tijd

Ik heb de volgende ASP.Net MVC Controller methode:

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

Het probleem is dat localTime hebben exact dezelfde waarde als utcDate. Ik neem aan dat dit is omdat utcDate het niet weet, heeft een UTC-waarde. Dus mijn vraag is hoe kan ik zetten utcDate (waarvan ik WEET dat UTC) in de lokale?

  • weet u welke tijdzone u zich in?



4 Replies
  1. 45

    Als u weten de DateTime bevat een UTC-waarde, kunt u gebruik maken van de volgende:

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

    Bijvoorbeeld, in mijn huidige toepassing, ik maak timestamps in mijn database met SQL is utcnow, maar als ik lees ze in mijn C# applicatie-de Kind proeprty is altijd Unknown. Ik heb een wrapper-functie voor het lezen van de timestamp, met opzet haar Kind te Utc, en converteer deze naar lokale tijd, vooral als hierboven.

    Er rekening mee dat Datum en tijd.ToLocalTime() alleen niet van invloed op de waarde als een (of beide) van de volgende geldt:

    • De DateTime’s Kind eigendom is DateTimeKind.Local
    • Uw lokale tijdzone is dat “geen verandering” is de juiste conversie

    Ik denk dat we kunnen aannemen dat het tweede punt is niet waar. Het schijnt dus dat iKnowThisIsUtc’s Kind de eigenschap is ingesteld op Local al. Je moet om erachter te komen waarom wat is het leveren van u met deze DateTimes denkt dat ze zijn lokaal.

    • NB AFAIK de enige manier ToLocalTime() zal niet wijzigen de waarde is als de runtime denkt dat het tijd is reeds local.* (I. e. het heeft DateTimeKind.Local.) Je zou willen om te controleren of dit het geval is en, zo ja, waarom de data die je krijgt zijn gemarkeerd als Local ook al zijn ze niet. (* of als de lokale tijd is UTC natuurlijk)
    • +1 voor me te slaan naar de uitleg die u hebt toegevoegd in de reactie, hoewel ik denk dat je het hoort als onderdeel van het antwoord.
    • Toen keek ik in deze een tijdje terug, ik vond het erg verwarrend. Uw antwoord doet zijn werk goed doet als het uit te leggen, maar sommige voorbeelden zou waarschijnlijk helpen.
    • Als u het toevoegen van de +1 voor het antwoord, denk ook upvoting de vraag – als u het nuttig vindt.
    • U moet ook controleren van de server tijdzone correct is ingesteld, d.w.z. als de server is gezet naar UTC zal het niet doen van een conversie, zoals het denkt UTC en lokale tijd hetzelfde is.
    • Nou… ja. Je kan niet verwachten dat de server iets “lokale tijd” als het niet weet wat de lokale tijd is.
    • Slechts te wijzen op iets dat ik heb gezien dat mensen getriggerd door. Ze kunnen niet denken om te controleren of de server tijdzone correct is ingesteld en dan kan het niet voor de hand dat de code correct is en de server-instelling onjuist.
    • De namen van de variabele in dit voorbeeld code perfect. Dank u.
    • Is het niet hetzelfde als DateTime localVersion = TimeZoneInfo.ConvertTimeFromUtc(iKnowThisIsUtc, TimeZoneInfo.Local)?

  2. 4

    Probeer het volgende:

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

    Uiteraard wijzigen Pacific naar uw lokale tijdzone.

    Als u wilt om uit te vinden wat tijd zones aanwezig zijn op uw machine zie de volgende link: http://msdn.microsoft.com/en-us/library/bb397781.aspx

  3. 1

    of deze:

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *