Język JavaScript posiada specjalny obiekt służący do przechowywania wartości daty i czasu oraz pracy z nimi – Date. Obiekt ten pozwala zarówno na odczytanie bieżącej wartości daty i czasu, rozłożenie jej na składowe (dzień, miesiąc, rok, itd.), oraz niezależną modyfikację każdej z nich. Warto także zauważyć że obiekt Date pozwala na przechowywanie także milisekund – taka precyzja zwykle nie jest potrzebna, ale może być przydatna w skrypcie mierzącym czas pomiędzy dwoma zdarzeniami.

Tworzenie obiektu Date

Aby odczytać bieżącą datę i czas, należy użyć konstruktora w wersji bez parametrów:

var data_czas = new Date();

Można także stworzyć obiekt Date który będzie zawierał ściśle określoną wartość daty i czasu – do tego celu należy użyć konstruktora który może przyjąć od dwóch (rok, miesiąc) do siedmiu parametrów (rok, miesiąc, dzień, godzina, minuty, sekundy, milisekundy). Jeżeli poda się mniej niż siedem parametrów, to funkcja użyje wartości domyślnych dla parametrów niepodanych (jeden dla dnia i zero dla pozostałych wartości). Ważne jest także aby numer miesiąca był liczbą z przedziału 0-11 (czyli trzeba “normalny” numer miesiąca pomniejszyć o jeden).

var dc;
dc = new Date(2008, 1); // 1 luty 2008 00:00:00.0
dc = new Date(2008, 1, 21); // 21 luty 2008 00:00:00.0
dc = new Date(2008, 1, 21, 21); // 21 luty 2008 21:00:00.0
dc = new Date(2008, 1, 21, 21, 41); // 21 luty 2008 21:41:00.0
dc = new Date(2008, 1, 21, 21, 41, 18); // 21 luty 2008 21:41:18.0
dc = new Date(2008, 1, 21, 21, 41, 18, 22); // 21 luty 2008 21:41:18.022

Istnieje też trzeci konstruktor, który jako parametr przyjmuje ilość milisekund która upłynęła od północy 1 stycznia 1970 (dla dat sprzed tej daty wartości są ujemne).

Jeżeli ktoś potrzebuje pracować z czasem UTC (GMT), może bezpośrednio utworzyć obiekt z żądaną wartością daty/czasu za pomocą funkcji Date.UTC(). Funkcja posiada identyczne parametry jak omówiony przed chwilą konstruktor, i podobnie jak on może być wywołana z różną liczbą parametrów (od 2 do 7), więc nie będę się tutaj dłużej nad nią rozwodził.

Istnieje także możliwość utworzenia obiektu Date na podstawie analizy ciągu znaków – służy do tego funkcja Date.parse(). Ponieważ jednak istnieje wiele formatów zapisu daty i czasu (tutaj występują nawet różnice między przeglądarkami, tak jak to pokażę dalej), więc funkcja ta może nie zawsze działać poprawnie.

Konwersja obiektu Date na ciąg znaków

Do konwersji obiektu Date na string można użyć m.in. funkcji toString(). Funkcja ta zwraca string który zawiera datę, czas oraz informacje o strefie czasowej. String ten jest w języku angielskim. Dodatkowo każda przeglądarka dla tej samej daty i czasu zwraca co innego:

  • Firefox: Thu Feb 21 2008 21:41:18 GMT+0100
  • IE: Thu Feb 21 21:41:18 UTC+0100 2008
  • Opera: Thu, 21 Feb 2008 21:41:18 GMT+0100
  • Safari: Thu Feb 21 2008 21:41:18 GMT+0100 (Środkowoeuropejski czas stand.)

Drugą funkcją do konwersji obiektu Date na string jest toLocaleString(). Funkcja ta powinna dokonać konwersji zgodnie z bieżącymi ustawieniami regionalnymi. Tutaj jednak też występują różnice między przeglądarkami:

  • Firefox: 21 luty 2008 21:41:18
  • IE: 21 lutego 2008 21:41:18
  • Opera: 2008-02-21 21:41:18
  • Safari: Thursday, February 21, 2008 21:41:18

Jak widać powyżej przeglądarka Safari zignorowała fakt że powinna użyć nazw i formatu specyficznego dla języka polskiego i wyświetliła wszystko po angielsku. Przeglądarka ta jest jednak wciąż w wersji beta, więc można oczekiwać że w wersji finalnej zostanie to naprawione.

Trzecią funkcją do konwersji obiektu Date na string jest toUTCString(). Funkcja ta konwertuje czas na format UTC (Universal Coordinated Time, znany także jako czas GMT). Tym razem przeglądarki są jednak zgodne – każda z nich zwraca string “Thu, 21 Feb 2008 20:41:18 GMT”. Warto także wiedzieć że funkcja ta może być także wywołana za pomocą nazwy toGMTString().

Dwie z wymienionych wcześniej funkcji (toString() i toLocaleString()) posiadają także dwie dodatkowe wersje pozwalające na dokonanie konwersji tylko daty lub tylko czasu. Do konwersji daty na string służą odpowiednio funkcje toDateString() i toLocaleDateString(), a do konwersji czasu – toTimeString() i toLocaleTimeString().

Odczyt składowych daty i czasu

Istnieje także możliwość bezpośredniego odczytania każdego z elementów daty/czasu przechowywanych w obiekcie Date. W ten sposób można także odczytać wartość milisekund, to nie było możliwe za pomocą wyżej omówionej rodziny funkcji to*String().

Funkcje te nazywają się następująco:

  • getFullYear() – rok (cztery cyfry);
  • getMonth() – miesiąc (od 0 do 11);
  • getDate() – dzień (od 1 do 31);
  • getHours() – godzina (od 0 do 23);
  • getMinutes() – minuty (od 0 do 59);
  • getSeconds() – sekundy (od 0 do 59);
  • getMilliseconds() – milisekundy (od 0 do 999).

Wymienione powyżej funkcje można wykorzystać np. do własnego formatowania daty i czasu, tak aby uniezależnić się od przeglądarek:

// Nazwy miesięcy
var nazwy_mies = [ 'Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 
    'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 
    'Listopad', 'Grudzień' ];
 
// Odczytanie bieżącej daty i czasu, i rozbicie ich na składowe
var data = new Date();
var rok = data.getFullYear();
var mies = data.getMonth();
var dzien = data.getDate();
var godz = data.getHours();
var min = data.getMinutes();
var sec = data.getSeconds();
 
// Dodanie zera na początku minut i sekund jeżeli trzeba
if (min < 10)
    min = '0' + min;
if (sec < 10)
    sec = '0' + sec;
 
// Utworzenie odpowiednio sformatowanej daty i czasu
var data_i_czas = dzien + ' ' + nazwy_mies[mies] + ' ' + rok 
    + ', ' + godz + ':' + min + ':' + sec;
 
document.write(data_i_czas);

Istnieje także funkcja getDay() która zwraca numer dnia tygodnia (od 0 do 6). Kolejne liczby oznaczają kolejno: 0 – niedziela, 1 – poniedziałek, 2 – wtorek, 3 – środa, 4 – czwartek, 5 – piątek, 6 – sobota).

W starszych skryptach można czasem znaleźć funkcję getYear() – funkcja ta powinna zwrócić wartość (rok – 1900), ale niestety w IE działa ona inaczej – dla lat spoza zakresu 1900-1999 zwraca normalny rok czterocyfrowy. Funkcja ta jest też oznaczona jako przestarzała, więc zamiast niej należy stosować funkcję getFullYear().

Można także odczytać przesunięcie czasu w bieżącej strefie czasowej – do tego celu służy funkcja getTimezoneOffset() – funkcja ta zwraca ilość minut różnicy pomiędzy czasem lokalnym a czasem UTC (GMT).

Większość z wymienionych wcześniej funkcji posiada także wersję zwracającą odpowiedni element daty/czasu UTC:

  • getUTCFullYear() – rok UTC (cztery cyfry);
  • getUTCMonth() – miesiąc UTC (od 0 do 11);
  • getUTCDate() – dzień UTC (od 1 do 31);
  • getUTCHours() – godzina UTC (od 0 do 23);
  • getUTCMinutes() – minuty UTC (od 0 do 59);
  • getUTCSeconds() – sekundy UTC (od 0 do 59);
  • getUTCMilliseconds() – milisekundy UTC (od 0 do 999);
  • getUTCDay() – dzień tygodnia UTC (od 0 do 6).

Jeżeli ktoś potrzebowałby dostać się do rzeczywistej wartości obiektu Date, czyli ilości milisekund od północy 1 stycznia 1970, może użyć funkcji getTime().

Modyfikacja składowych daty i czasu

Obiekt Date posiada także funkcje pozwalające na niezależne modyfikowanie każdej składowej daty i czasu. Ich nazwy łatwo zapamiętać – od tych wymienionych powyżej różnią się jedynie prefiksem “set”:

  • setFullYear(rok) – rok (cztery cyfry);
  • setMonth(miesiąc) – miesiąc (od 0 do 11);
  • setDate(dzień) – dzień (od 1 do 31);
  • setHours(godzina) – godzina (od 0 do 23);
  • setMinutes(minuty) – minuty (od 0 do 59);
  • setSeconds(sekundy) – sekundy (od 0 do 59);
  • setMilliseconds(milisekundy) – milisekundy (od 0 do 999).

Istnieją oczywiście także wersje tych funkcji pozwalające na pracę z datą/czasem UTC:

  • setUTCFullYear(rok) – rok UTC (cztery cyfry);
  • setUTCMonth(miesiąc) – miesiąc UTC (od 0 do 11);
  • setUTCDate(dzień) – dzień UTC (od 1 do 31);
  • setUTCHours(godzina) – godzina UTC (od 0 do 23);
  • setUTCMinutes(minuty) – minuty UTC (od 0 do 59);
  • setUTCSeconds(sekundy) – sekundy UTC (od 0 do 59);
  • setUTCMilliseconds(milisekundy) – milisekundy UTC (od 0 do 999).

Można także bezpośrednio zmodyfikować całą wartość przechowywaną w obiekcie Date jako ilość milisekund od północy 1 stycznia 1970 – służy do tego funkcja setTime().