Voor DateTime Voor een Andere Tijdzone, Ongeacht de Lokale Tijdzone

Ongeacht van wat de gebruiker op de lokale tijdzone is ingesteld, met behulp van C# (.NET 2.0) ik nodig heb om de tijd te bepalen (DateTime object) in de Eastern time zone.

Ik weet over deze methoden, maar er lijkt niet te zijn een voor de hand liggende manier om een DateTime-object voor een andere tijdzone is dan wat de gebruiker in.

 DateTime.Now
 DateTime.UtcNow
 TimeZone.CurrentTimeZone

Natuurlijk, de oplossing moet worden zomertijd bewust.

InformationsquelleAutor Dave | 2009-01-13

 

6 Replies
  1. 8

    Als iedereen anders vermeld .NET 2 bevat geen informatie over de tijdzone.
    De informatie wordt opgeslagen in het register, maar zijn tamelijk triviaal voor het schrijven van een wrapper-klasse omheen:

    SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones

    bevat sub-toetsen voor alle tijdzones. De TZI veld waarde bevat alle de overgang en de bias eigenschappen voor een tijdzone, maar het is allemaal gevuld in een binaire matrix. De belangrijkste bits (bias en daglicht), zijn int32s opgeslagen op de posities 0 en 8 respectievelijk:

    int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0);
    int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8);

    Hier is een archief van Hoe krijgt u de tijd zone info (DST) van de registry?

  2. 88

    In .NETTO 3.5, er is TimeZoneInfo, die biedt veel functionaliteit in dit gebied; 2.0SP1 heeft DateTimeOffset, maar dit is veel meer beperkt.

    Krijgen UtcNow en het toevoegen van een vaste offset is een onderdeel van het werk, maar is niet DST-bewust.

    Dus in 3.5 ik denk dat je iets kunnen doen als:

    DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
        DateTime.UtcNow, "Eastern Standard Time");

    Maar dit gewoon niet bestaat in 2.0; sorry.

    • Als hij zelfs niet binnen de OP de beperkingen, antwoordde hij op MIJN vraag, dus ik modded dit 🙂
    • Bedankt! Ik wil gewoon toe te voegen: ReadOnlyCollection<TimeZoneInfo> tz = TimeZoneInfo.GetSystemTimeZones(); DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, tz[0].Id);
  3. 6

    Van – http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx

    Dit kan een tijdzone te worden gevonden door de naam, in het geval van de VS ooit drijft 15 graden in het westen of in het oosten van Londen meridiaan.

    DateTime timeUtc = DateTime.UtcNow;
    try
    {
       TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
       DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
       Console.WriteLine("The date and time are {0} {1}.", 
                         cstTime, 
                         cstZone.IsDaylightSavingTime(cstTime) ?
                                 cstZone.DaylightName : cstZone.StandardName);
    }
    catch (TimeZoneNotFoundException)
    {
       Console.WriteLine("The registry does not define the Central Standard Time zone.");
    }                           
    catch (InvalidTimeZoneException)
    {
       Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted.");
    }
  4. 2

    Ik bespaar u de tijd en je vertellen dat er geen manier in .netto goede, versie 2.0 te krijgen DateTime object voor een andere tijdzone verschilt van die van de software die wordt uitgevoerd op (andere dan UTC).

    Echter, dat betekent niet dat er niet een manier om het te doen buiten .netto. Neem een kijkje hier op de TimeZoneInformation klasse. Deze klasse wraps sommige p/invoke spullen aan het Winnen O/S om de tijdzone-informatie van de O/S. ik met succes gebruikt het terug bij 2.0 was nieuw en het werkte heel goed. De site werkte ik op moest kunnen tonen elke datum/tijd op de lokale en de gebruiker moest worden DST-bewust, en deze klasse vol de rekening voor ons.

  5. 1

    Hoe over

     DateTime lclTime = DateTime.Now;
     DateTime ept = lclTime.ToUniversalTime().AddHours(
                       IsEasternDaylightSavingTime(
                           lclTime.ToUniversalTime())? -5: -4)

    of als je al lokale UTC, op slechts

     DateTime lclUtc = DateTime.UtcNow;
     DateTime ept = lclUtc.AddHours(
                      IsEasternDaylightSavingTime(lclUtc)? -5: -4)

    Gebruik van statische woordenboek van de hard gecodeerde waarden voor de Lente-vooruit en terug te vallen data voor Oost-tijd voor de volgende 50 jaar.. Dat is slechts 300 bytes of zo… en dan de index in om te bepalen of het instellen van de zomertijd op de east coast… Zoals gezegd, u don ‘ t care of het nu de zomertijd in de lokale zone of niet…

     private static bool IsEasternDaylightSavingTime(DateTime utcDateTime)
       {
            //hard coded method to determine 
            //whether utc datetime is Eastern Standard time
            //or Eastern Daylight Time
       }
    • Wat als uw locatie niet ZOMERTIJD? Dan IsDaylightSavingTime zal false terug.
    • UTC zal niet worden beïnvloed door de ZOMERTIJD; het is zeker de Oost-s DST we moeten weten, niet de lokale bevolking.
    • Kreeg mij… ik weet niet of je kunt een timezone object voor een andere tijdzone is dat de één de computer is ingesteld. En je zou t ocreate een timezone object voor Oost-tijd om te bepaal of het ZOMERTIJD of niet…
  6. 0

    Een datum vergelijking is een datum vergelijking. DateTime gewoon wraps een memory-structuur die is gedefinieerd in teken en maakt methoden om toegang te krijgen tot veelgebruikte onderdelen van het geheugen bijv. de dag of het jaar of de Tijd of TimeOfDay enz.

    Verder conversie is alleen mogelijk als u weet dat zowel de bron snd bestemming offsets en vervolgens de berekening wordt altijd als gegeven is gegeven door -1 * (sourceOffset - destOffset)

    Waar het onderdeel staat tussen haakjes de tijdzone verschil.

    Zie ook

    Voor oost-tijd in c# zonder converteren plaatselijke tijd

Geef een reactie

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