Java i SimpleDateFormat – aktualne czas i data, a strefy czasowe

Java API oferuje kilka klas, które mają pomóc programiście w obchodzeniu się z datami, godzinami oraz strefami czasowymi. Istnieje Date, którego większość metod została zdeprecjonowania, gdyż klasa ta miała problemy z obsługą stref czasowych i na chwilę obecną służy tylko jako klasa enkapsulująca timestamp, czyli liczby milisekund od początku ery UNIXów, czyli 1970 roku licząc czasem UTC/GMT. Istnieje klasa Calendar, która jest właśnie następcą tej pierwszej i oferuje ona cały zestaw funkcjonalności związanych z datami/godzinami z uwzględnieniem stref czasowych. Jest jednak o wiele wygodniejszy sposób na uwzględnienie stref czasowych niż posługiwanie się klasą Calendar – znana wszystkim klasa SimpleDateFormat również posiada bezpośrednią obsługę stref czasowych.

Najpierw kod, który będziemy rozpatrywać.

import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.Date;
 
public class JavaApplication1 {
 
    public static void main(String[] av) {
        SimpleDateFormat simpleDateHere = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss (Z)");
        System.out.println( simpleDateHere.format(new Date()) );
 
        SimpleDateFormat simpleDateThere = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss (Z)");
        simpleDateThere.setTimeZone( TimeZone.getTimeZone("Japan") );
        System.out.println( simpleDateThere.format(new Date()) );
    }
}

W pierwszej linijce tworzymy obiekt wypisujący datę i czas w określonym przez nas formacie oraz z domyślną strefą czasową (u mnie Europe/Belgrad) – czyli obiekt klasy SimpleDateFormat. Wzorzec inicjalizujący konstruktor sprawi, że obiekt będzie zwracał string w formacie:

2012-04-01 15:40:25 (+0200)

W drugiej linijce tworzymy obiekt klasy Date, który utworzony w ten sposób będzie enkapsulować aktualny czas i datę w formie timestamp – czyli liczbie milisekund od 1.1.1970 licząc po UTC/GMT. Podajemy go do metody format() obiektu klasy SimpleDateFormat i na wyściu dostajemy datę i czas w naszy wzorze i w domyślenj strefie czasowej.

Drugi blok kodu jest bardzo podobny, ale ma dodatkową linię. Metodą TimeZone.getTimeZone(„Japan”) pobieramy identyfikator przykładowej strefy czasowej – tutaj japońskiej. I ten identyfikator przekazujemy do metody setTimeZone() ustawiając tym samym strefę czasową obiektu klasy SimpleDateFormat na taką właśnie. Teraz, gdy podamy do metody format() aktualny czas poprzez new Date(), to przed zwróceniem sformatowanego stringu nastąpi automatycza konwersja strefy czasowej na wybraną przez nas.

Cały kod daje rezultat typu:
2012-04-01 15:40:25 (+0200)
2012-04-01 22:40:25 (+0900)