Översikt över tidszon
Klassen TimeZoneInfo förenklar skapandet av tidszonsmedvetna program. Klassen TimeZone stöder arbete med den lokala tidszonen och Coordinated Universal Time (UTC). Klassen TimeZoneInfo stöder båda dessa zoner samt alla tidszoner om vilken information som är fördefinierad i registret. Du kan också använda TimeZoneInfo för att definiera anpassade tidszoner som systemet inte har någon information om.
Grundläggande om tidszon
En tidszon är en geografisk region där samma tid används. Vanligtvis, men inte alltid, ligger angränsande tidszoner med en timmes mellanrum. Tiden i någon av världens tidszoner kan uttryckas som en förskjutning från Coordinated Universal Time (UTC).
Många av världens tidszoner stöder sommartid. Sommartid försöker maximera sommartid genom att flytta tiden framåt med en timme på våren eller försommaren och återgå till den normala (eller standard) tiden på sensommaren eller hösten. Dessa ändringar till och från standardtid kallas justeringsregler.
Övergången till och från sommartid i en viss tidszon kan definieras antingen av en fast eller flytande justeringsregel. En fast justeringsregel anger ett visst datum då övergången till eller från sommartid inträffar varje år. En övergång från sommartid till standardtid som inträffar varje år den 25 oktober följer till exempel en fast justeringsregel. Mycket vanligare är regler för flytande justering, som anger en viss dag i en viss vecka i en viss månad för övergången till eller från sommartid. En övergång från standardtid till sommartid som inträffar den tredje söndagen i mars följer till exempel en flytande justeringsregel.
För tidszoner som stöder justeringsregler skapar övergången till och från sommartid två typer av avvikande tider: ogiltiga tider och tvetydiga tider. En ogiltig tid är en obefintlig tid som skapas vid övergången från standardtid till sommartid. Om den här övergången till exempel inträffar en viss dag kl. 02:00 och gör att tiden ändras till 03:00, är varje tidsintervall mellan 02:00 och 02:59:59 A.M. ogiltigt. En tvetydig tid är en tid som kan mappas till två olika gånger i en enda tidszon. Den skapas genom övergången från sommartid till standardtid. Om den här övergången till exempel inträffar en viss dag kl. 02:00 och gör att tiden ändras till 01:00, kan varje tidsintervall mellan 01:00 och 01:59:59 A.M. tolkas som antingen en standardtid eller sommartid.
Tidszonsterminologi
I följande tabell definieras termer som ofta används när du arbetar med tidszoner och utvecklar tidszonsmedvetna program.
Period | Definition |
---|---|
Justeringsregel | En regel som definierar när övergången från standardtid till sommartid och tillbaka från sommartid till standardtid inträffar. Varje justeringsregel har ett start- och slutdatum som definierar när regeln är på plats (till exempel är justeringsregeln på plats från den 1 januari 1986 till den 31 december 2006), ett delta (hur lång tid standardtiden ändras till följd av tillämpningen av justeringsregeln) och information om det specifika datum och den tid som övergångarna ska ske under justeringsperioden. Övergångar kan följa antingen en fast regel eller en flytande regel. |
Tvetydig tid | En tid som kan mappas till två olika gånger i en enda tidszon. Det inträffar när klocktiden justeras tillbaka i tiden, till exempel under övergången från en tidszons sommartid till dess standardtid. Om den här övergången till exempel inträffar en viss dag kl. 02:00 och gör att tiden ändras till 01:00, kan varje tidsintervall mellan 01:00 och 01:59:59 A.M. tolkas som antingen en standardtid eller sommartid. |
Fast regel | En justeringsregel som anger ett visst datum för övergången till eller från sommartid. En övergång från sommartid till standardtid som inträffar varje år den 25 oktober följer till exempel en fast justeringsregel. |
Flytande regel | En justeringsregel som anger en viss dag i en viss vecka i en viss månad för övergången till eller från sommartid. En övergång från standardtid till sommartid som inträffar den tredje söndagen i mars följer till exempel en flytande justeringsregel. |
Ogiltig tid | En obefintlig tid som är en artefakt av övergången från standardtid till sommartid. Det inträffar när klocktiden justeras framåt i tiden, till exempel under övergången från en tidszons standardtid till dess sommartid. Om den här övergången till exempel inträffar en viss dag kl. 02:00 och gör att tiden ändras till 03:00, är varje tidsintervall mellan 02:00 och 02:59:59 A.M. ogiltigt. |
Övergångstid | Information om en specifik tidsändring, till exempel övergången från sommartid till standardtid eller vice versa, i en viss tidszon. |
Tidszoner och klassen TimeZoneInfo
I .NET representerar ett TimeZoneInfo objekt en tidszon. Klassen TimeZoneInfo innehåller en GetAdjustmentRules metod som returnerar en matris med TimeZoneInfo.AdjustmentRule objekt. Varje element i den här matrisen innehåller information om övergången till och från sommartid under en viss tidsperiod. (För tidszoner som inte stöder sommartid returnerar metoden en tom matris.) Varje TimeZoneInfo.AdjustmentRule objekt har en DaylightTransitionStart och en DaylightTransitionEnd egenskap som definierar det specifika datumet och tiden för övergången till och från sommartid. Egenskapen IsFixedDateRule anger om övergången är fast eller flytande.
.NET förlitar sig på tidszonsinformation som tillhandahålls av Windows-operativsystemet och lagras i registret. På grund av antalet tidszoner på jorden representeras inte alla befintliga tidszoner i registret. Eftersom registret är en dynamisk struktur kan fördefinierade tidszoner dessutom läggas till eller tas bort från det. Slutligen innehåller registret inte nödvändigtvis historiska tidszonsdata. I Windows XP innehåller registret till exempel endast data om en enda uppsättning tidszonsjusteringar. Windows Vista har stöd för dynamiska tidszonsdata, vilket innebär att en enda tidszon kan ha flera justeringsregler som gäller för specifika intervall på år. De flesta tidszoner som definieras i Windows Vista-registret och har stöd för sommartid har dock bara en eller två fördefinierade justeringsregler.
Klassens beroende av TimeZoneInfo registret innebär att ett tidszonsmedvetent program inte kan vara säker på att en viss tidszon definieras i registret. Därför bör försöket att instansiera en specifik tidszon (förutom den lokala tidszonen eller tidszonen som representerar UTC) använda undantagshantering. Den bör också tillhandahålla en metod för att låta programmet fortsätta om ett obligatoriskt TimeZoneInfo objekt inte kan instansieras från registret.
För att hantera avsaknaden av en nödvändig tidszon TimeZoneInfo innehåller klassen en CreateCustomTimeZone metod som du kan använda för att skapa anpassade tidszoner som inte finns i registret. Mer information om hur du skapar en anpassad tidszon finns i Så här skapar du tidszoner utan justeringsregler och Så här skapar du tidszoner med justeringsregler. Dessutom kan du använda ToSerializedString metoden för att konvertera en nyskapade tidszon till en sträng och spara den i ett datalager (till exempel en databas, en textfil, registret eller en programresurs). Du kan sedan använda metoden för att konvertera strängen FromSerializedString tillbaka till ett TimeZoneInfo objekt. Mer information finns i Så här sparar du tidszoner till en inbäddad resurs och Så här återställer du tidszoner från en inbäddad resurs.
Eftersom varje tidszon kännetecknas av en basförskjutning från UTC, samt av en förskjutning från UTC som återspeglar alla befintliga justeringsregler, kan en tid i en tidszon enkelt konverteras till tiden i en annan tidszon. För detta ändamål innehåller objektet TimeZoneInfo flera konverteringsmetoder, bland annat:
ConvertTimeFromUtc, som konverterar UTC till tiden i en angiven tidszon.
ConvertTimeToUtc, som konverterar tiden i en angiven tidszon till UTC.
ConvertTime, som konverterar tiden i en angiven tidszon till tiden i en annan angiven tidszon.
ConvertTimeBySystemTimeZoneId, som använder tidszonsidentifierare (i stället för TimeZoneInfo objekt) som parametrar för att konvertera tiden i en angiven tidszon till tiden i en annan angiven tidszon.
Mer information om hur du konverterar tider mellan tidszoner finns i Konvertera tider mellan tidszoner.