Oddzielnym tematem jest pomiar czasu w Java. Obiekt System daje nam dwie metody pozwalające na odmierzanie czasu i są to: .currentTimeMillis() oraz .nanoTime(), z czego tylko ten pierwszy pozwala na powiązanie z datą. Przykład użycia metod zamieszczony jest poniżej.

public class Czas {

    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());
        System.out.println(System.nanoTime());
    }
    
}

Mierzenie czasu trwania operacji

Aby wyliczyć czas wykonywania jakiegoś podprogramu (np. w celach testowych gdy staramy się zoptymalizować program pod względem czasu) możemy użyć prostego porównania dwu czasów.

public class CzasMilisekundowy {

    public static void main(String[] args) {
        long czas0;
        czas0=System.currentTimeMillis();
        
        //operacje do wykonania, których czas mierzymy
        
        System.out.println(System.currentTimeMillis()-czas0);      
    }
    
}

Można też skorzystać z drugiej metody by określić czas w nanosekundach zamiast milisekund (jeśli ten pomiar okazuje się niewystarczająco dokładny).

public class CzasNanosekundowy{

    public static void main(String[] args) {
        long czas0;
        czas0=System.nanoTime();
        
        //operacje do wykonania, którego czas mierzymy
        
        System.out.println(System.nanoTime()-czas0);      
    }
    
}

Data systemowa

Inną kwestią jest gdy chcemy pobrać datę systemową, wtedy należy skorzystać z dodatkowych bibliotek

import java.sql.Date;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class Data_i_Czas{

    public static void main(String[] args) {
        
        System.out.println(LocalDate.now());          // na wzór: 2021-12-16
        System.out.println(LocalDateTime.now());      // na wzór: 2021-12-16T09:57:43.500
        System.out.println(LocalDateTime.now(ZoneId.of("UTC")));  // na wzór j.w. w strefie czasowej UTC (Universal Time Coordinated)
        
    }
    
}

Wstrzymanie programu na xxx milisekund

Odrębnym zagadnieniem jest to, gdy chcemy spowodować, aby program zatrzymał się na x sekund. Mozna to w prosty sposób zrobić tak jak poniżej:

public class Data {

    public static void main(String[] args) {
        
        long ileSekundCzekac=5000;
        System.out.printf("Czekam %10dms... ",ileSekundCzekac);
        for (long a=System.currentTimeMillis();System.currentTimeMillis()<a+ileSekundCzekac;) ;     // <-- pusta pętla
        System.out.println("Skończyłem czekanie...");

    }
    
}

Jednym zdaniem, wykonujemy pustą pętlę dopóki czas systemowy nie będzie się różnił o xxx milisekund od czasu rozpoczęcia tej pętli. Oczywiście wygodnym jest zdefiniowanie metody realizującej czekanie, na przykład takiej jak poniżej…

    public static boolean czekaj(long ms) {
        for (long a=System.currentTimeMillis();System.currentTimeMillis()<a+ms;) ;        
        return true;
        }
    

Metoda taka nie wypisuje żadnych komunikatów, przyjmuje jako parametr ilość milisekund do wstrzymania działania w zmiennej typu long i zwraca wartość true na znak, że wykonała się poprawnie.

Wykraczając już daleko poza zakres Podstaw z Języków Programowania można nawiązać jeszcze do jednego sposobu. Wymaga on jedynie przyjęcia “na wiarę”, że istnieją wątki (Thread) w których wykonywany jest program i są metody służące wstrzymywaniu wykonywania danego wątku oraz synchronizacji wątku z innym. Nie wdając się w szczegóły użycie tej metody wygląda tak jak na poniższym przykładzie:

public class Data {
    
    public static void main(String[] args) {
                
        System.out.println("Czekam kolejne 5s... za pomocą Thread"); 

        try  {
            Thread.sleep(5000);
             } catch (InterruptedException ex) { System.out.println("Wystąpiło przerwanie..."); }

        System.out.println("Skończyłem czekanie ... za pomocą Thread"); 
        
    }
    
}