Hantera kalenderdatum och tidpunkter

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Alla funktioner för hantering av kalenderdatum och tidpunkter i ActionScript 3.0 är samlade i den översta klassen Date. Klassen Date innehåller metoder och egenskaper med vilka du hanterar datum och tidpunkter i antingen universaltid (Coordinated Universal Time) eller lokaltid i en specifik tidszon. Universaltid (UTC) är en standardtidsdefinition som i princip är densamma som GMT (Greenwich Mean Time).

Skapa Date-objekt

Klassen Date innehåller en av de mest mångsidiga konstruktormetoderna av alla huvudklasser. Du kan anropa den på fyra olika sätt.

För det första, om inga parametrar anges, returnerar konstruktorn Date() ett Date-objekt med aktuellt datum och aktuell tid (lokal tid, baserat på tidszonen). Här är ett exempel:

var now:Date = new Date();

För det andra, om en enda numerisk parameter anges, behandlar konstruktorn Date() det som antalet millisekunder sedan 1 januari 1970 och returnerar ett motsvarande Date-objekt. Observera att det millisekundvärde du anger behandlas som antal millisekunder sedan 1 januari 1970 i universaltid (UTC). Däremot visar Date-objektet värden i din lokala tidszon, såvida du inte använder UTC-specifika metoder för att hämta och visa dem. Om du skapar ett nytt Date-objekt med hjälp av en enda millisekundsparameter måste du ta hänsyn till tidzonsskillnaden mellan lokal tid och UTC-tid. I följande kod skapas ett Date-objekt angivet som midnatt den 1 januari 1970, i UTC:

var millisecondsPerDay:int = 1000 * 60 * 60 * 24; 
// gets a Date one day after the start date of 1/1/1970 
var startTime:Date = new Date(millisecondsPerDay);

För det tredje kan du skicka flera numeriska parametrar till konstruktorn Date(). Den behandlar parametrarna som år, månad, dag, timma, minut, sekund och millisekund samt returnerar motsvarande Date-objekt. Dessa indataparametrar antas vara i lokal tid, inte i UTC. Med följande kod hämtas ett Date-objekt angivet som midnatt den 1 januari 2000, i lokal tid:

var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);

För det fjärde kan du skicka en enstaka strängparameter till konstruktorn Date(). Den försöker tolka strängen som datum- eller tidskomponenter och returnerar sedan ett motsvarande Date-objekt. När du använder det här sättet kan det vara bra att infoga konstruktorn Date() i ett try..catch-block för att fånga upp tolkningsfel. Konstruktorn Date() har stöd för ett antal olika strängformat (som finns listade i Referenshandbok för ActionScript 3.0 i Adobe Flash-plattformen). Med följande kodsats initieras ett nytt Date-objekt med ett strängvärde:

var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");

Om konstruktorn Date() inte kan tolka strängparametern genereras inget undantag. Däremot kommer resulterande Date-objekt att innehålla ett ogiltigt datumvärde.

Hämta värden för tidsenheter

Du kan extrahera värden för olika tidsenheter inom ett Date-objekt med hjälp av egenskaper eller metoder i klassen Date. Alla följande egenskaper ger ett värde för en tidsenhet i Date-objektet:

  • Egenskapen fullYear

  • Egenskapen month , vilket är i numeriskt format från 0 för januari till 11 för december

  • Egenskapen date , vilket är kalendernumret på dagen i månaden, från 1 till 31

  • Egenskapen day , vilket är veckodagen i numeriskt format, där 0 motsvarar söndag

  • Egenskapen hours , från 0 till 23

  • Egenskapen minutes

  • Egenskapen seconds

  • Egenskapen milliseconds

    Med klassen Date finns det flera sätt att hämta respektive värden på. Du kan till exempel hämta månadsvärdet för ett Date-objekt på fyra olika sätt:

  • Egenskapen month

  • Metoden getMonth()

  • Egenskapen monthUTC

  • Metoden getMonthUTC()

    Alla fyra sätten är i princip likvärdiga vad gäller effektivitet, så du kan använda det sätt som bäst passar för programmet.

    Egenskaperna som räknades upp representerar komponenter för det totala datumvärdet. Egenskapen för millisekunder är till exempel aldrig större än 999; när 1 000 uppnås ökas sekundvärdet med 1 och räknaren för millisekunder nollställs.

    Om du vill hämta värdet för Date-objektet i antal millisekunder sedan 1 januari 1970 (UTC) så kan du använda metoden getTime(). Med den motsvarande metoden setTime() kan du ändra värdet för ett befintligt Date-objekt med millisekunder sedan 1 januari 1970 (UTC).

Genomföra beräkningar med datum och tidpunkter

Du kan utföra addition och subtraktion för datum och tidpunkter med klassen Date. Datumvärden används internt i millisekunder, vilket innebär att du behöver konvertera andra värden till millisekunder innan du kan addera dem till eller subtrahera dem från Date-objekt.

Om programmet ska utföra många beräkningar med datum och tidpunkter kan det vara praktiskt att skapa konstanter för vanliga tidsenheter i antal millisekunder enligt följande:

public static const millisecondsPerMinute:int = 1000 * 60; 
public static const millisecondsPerHour:int = 1000 * 60 * 60; 
public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;

På så vis är det enkelt att utföra datumberäkning med standardtidsenheter. I följande kod anges ett datumvärde till en timma från aktuell tidpunkt med hjälp av metoderna getTime() och setTime():

var oneHourFromNow:Date = new Date(); 
oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);

Ett annat sätt att ange ett datumvärde är att skapa ett nytt Date-objekt med en enda millisekundsparameter. Med följande kod läggs 30 dagar till ett datum för att beräkna ett annat:

// sets the invoice date to today's date 
var invoiceDate:Date = new Date(); 
 
// adds 30 days to get the due date 
var dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));

Därefter multipliceras konstanten millisecondsPerDay med 30 som motsvarar 30 dagars tid och resultatet läggs till värdet invoiceDate och används för att ange värdet dueDate.

Konvertering mellan tidszoner

Beräkningar med datum och tidpunkter är praktiskt om du vill konvertera datum från en tidszon till en annan. Detta görs i metoden getTimezoneOffset() som sedan returnerar värdet i antal minuter som Date-objektets tidszon skiljer sig från UTC. Ett värde returneras i minuter eftersom inte alla tidszoner har ökningar i jämna timantal; vissa har en halvtimmes skillnad från närliggande tidszon.

I följande exempel används tidszonsskillnaden för att konvertera ett datum från lokal tid till UTC. Konverteringen utförs först genom att beräkna tidszonsvärdet i millisekunder och sedan justera Date-värdet med antalet:

// creates a Date in local time 
var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM"); 
 
// converts the Date to UTC by adding or subtracting the time zone offset 
var offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000; 
nextDay.setTime(nextDay.getTime() + offsetMilliseconds);