Zarządzanie datami kalendarzowymi i godzinami

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Wszystkie funkcje do zarządzania datami kalendarzowymi i godzinami w języku ActionScript 3.0 zostały zebrane w klasie Date zdefiniowanej na najwyższym poziomie. Klasa Date zawiera metody i właściwości umożliwiające pracę z datami i godzinami w strefie czasowej UTC lub w lokalnej strefie czasowej. Czas UTC to standardowa definicja czasu, która jest zasadniczo równoważna czasowi Greenwich (GMT).

Tworzenie obiektów klasy Date

Klasa Date jest wyposażona w wyjątkowo wszechstronny konstruktor. Można go wywołać na cztery sposoby.

Po pierwsze, konstruktor Date() wywołany bez parametrów zwraca obiekt Date zawierający aktualną datę i godzinę w lokalnej strefie czasowej. Oto przykład:

var now:Date = new Date();

Po drugie, wywołanie Date() z jednym parametrem liczbowym powoduje, że parametr ten zostanie potraktowany jako liczba milisekund, jaka upłynęła od 1 stycznia 1970 roku i na tej podstawie zostanie utworzony odpowiedni obiekt klasy Date. Przekazywana liczba milisekund liczona jest od 1 stycznia 1970 roku wg czasu UTC. Natomiast zwrócony obiekt Date zawiera wartości właściwe dla lokalnej strefy czasowej. Dopiero użycie metod obsługujących czas UTC umożliwia pobranie i ewentualne wyświetlenie czasu uniwersalnego. Tworząc obiekt Date na podstawie liczby milisekund, należy uwzględnić różnicę między czasem lokalnym a UTC. Poniższe instrukcje tworzą obiekt Date reprezentujący północ w dniu 1 stycznia 1970 roku według czasu 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);

Po trzecie, do konstruktora Date() można przekazać wiele parametrów liczbowych. Parametry te są traktowane odpowiednio jako rok, miesiąc, dzień, godzina, minuty, sekundy i milisekundy, a na ich podstawie tworzony jest odpowiedni obiekt Date. Przyjmuje się, że parametry określają czas lokalny, a nie czas UTC. Poniższa instrukcja tworzy obiekt Date reprezentujący północ rozpoczynającą 1 stycznia 2000 roku w lokalnej strefie czasowej:

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

Po czwarte, do konstruktora Date() można przekazać jeden ciąg znaków. Konstruktor podejmie próbę zinterpretowania tego ciągu jako daty i godziny, a następnie zwróci odpowiedni obiekt Date. W wypadku zastosowania tej techniki wskazane jest ujęcie wywołania konstruktora Date() w blok try..catch , co pozwoli wychwycić ewentualne błędy analizy. Konstruktor Date() jako parametr przyjmuje ciąg znaków w różnych formatach (wymienionych w Skorowidzu języka ActionScript 3.0 dla platformy Adobe Flash ). Poniższa instrukcja inicjuje nowy obiekt Date przy użyciu ciągu znaków:

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

Jeśli konstruktor Date() nie będzie mógł pomyślnie przeanalizować ciągu znaków, nie zgłosi wyjątku. Jednak wynikowy obiekt Date będzie zawierał niepoprawną wartość daty.

Odczytywanie wartości jednostek czasu

Korzystając z właściwości i metod klasy Date, można wyodrębniać wartości różnych jednostek czasu z obiektów Date. Poniższe właściwości zwracają wartości jednostek czasu z obiektu Date:

  • Właściwość fullYear

  • Właściwość liczbowa month zawierająca wartości od 0 (styczeń) do 11 (grudzień).

  • Właściwość date zawierająca kalendarzowy numer dnia w miesiącu, z przedziału od 1 do 31.

  • Właściwość day zawierająca numer dnia w tygodniu, gdzie 0 oznacza niedzielę.

  • Właściwość hours zawierająca godzinę z przedziału od 0 do 23.

  • Właściwość minutes .

  • Właściwość seconds .

  • Właściwość milliseconds

    Klasa Date oferuje różne sposoby odczytywania tych właściwości. Przykładowo, numer miesiąca można odczytać z obiektu Date na cztery różne sposoby:

  • Z właściwości month .

  • Za pomocą metody getMonth() .

  • Z właściwości monthUTC .

  • Za pomocą metody getMonthUTC() .

    Wszystkie cztery sposoby są równoważne pod względem wydajności, dlatego można swobodnie wybrać sposób najwygodniejszy w danej aplikacji.

    Wymienione powyżej właściwości wspólnie stanowią składniki łącznej wartości daty. Na przykład właściwość milliseconds nie będzie nigdy większa od 999, ponieważ po osiągnięciu wartości 1000 liczba sekund zwiększa się o 1, a liczba milisekund jest zerowana.

    Aby pobrać wartość obiektu Date jako liczbę milisekund od 1 stycznia 1970 r. (UTC), można skorzystać z metody getTime() . Jej odpowiednik, metoda setTime() , umożliwia zmianę wartości obiektu Date poprzez określenie liczby milisekund od 1 stycznia 1970 r. (UTC).

Operacje arytmetyczne na datach i godzinach

Istnieje możliwość dodawania i odejmowania dat i godzin zapisanych w obiektach klasy Date. Wartości obiektów Date są wewnętrznie przechowywane w postaci liczby milisekund, dlatego przed dodawaniem lub odejmowaniem wartości do/od obiektu Date należy przeliczyć te wartości na milisekundy.

Jeśli aplikacja ma wykonywać liczne operacje arytmetyczne na datach i godzinach, celowe będzie utworzenie stałych zawierających wartości typowych jednostek czasu wyrażone w milisekundach:

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

Teraz będzie można wygodnie wykonywać operacje arytmetyczne na datach, korzystając ze standardowych jednostek czasu. Poniższy kod ustawia wartość daty na jedną godzinę później niż bieżący czas. Używane są w tym celu metody getTime() i setTime() :

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

Inny sposób ustawiania wartości daty polega na utworzeniu nowego obiektu Date z jednym parametrem równym liczbie milisekund. Poniższy kod dodaje 30 dni do jednej daty i tworzy drugą datę:

// 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));

Następnie stała millisecondsPerDay jest mnożona przez 30 w celu uzyskania okresu 30 dni, a wynik jest dodawany do wartości invoiceDate i przypisywany wartości dueDate .

Konwersja między strefami czasowymi

Operacje arytmetyczne na datach i godzinach są przydatne do przeliczania dat między strefami czasowymi. To zadanie wykonuje metoda getTimezoneOffset() , która zwraca liczbę minut, o jaką strefa czasowa obiektu Date różni się od czasu UTC. Wartość jest zwracana w minutach, ponieważ nie wszystkie strefy czasowe różnią się o wielokrotność jednej godziny — niektóre sąsiadujące strefy różnią się o pół godziny.

W poniższym przykładzie użyto przesunięcia strefy czasowej do przeliczenia daty z czasu lokalnego na UTC. Konwersja odbywa się poprzez obliczenia wartości strefy czasowej w milisekundach, a następnie skorygowanie wartości Date o tę wartość:

// 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);