System.currentTimeMillis în Java

currentTimeMillis() dă ora curentă în milisecunde de la 1 ianuarie 1970; nanoTime() măsoară precis durate.

Sintaxă
static long currentTimeMillis()
static long nanoTime()   // Java 5

Ce face System.currentTimeMillis

System.currentTimeMillis() returnează numărul de milisecunde trecute de la 1 ianuarie 1970, ora 00:00 UTC. Valoarea urmează ceasul sistemului, care poate fi ajustat (sincronizare de rețea, schimbare manuală), deci nu este bună pentru măsurarea duratelor. Pentru date și ore în cod nou folosește Instant.now() sau LocalDateTime.now().

System.nanoTime() returnează o valoare în nanosecunde de la un moment de referință arbitrar. Valoarea singură nu înseamnă nimic; are sens doar diferența dintre două apeluri. Ceasul este monoton (nu sare înapoi), deci este alegerea corectă pentru a măsura cât durează o operație.

Ambele valori se schimbă la fiecare rulare, așa că rezultatele de mai jos sunt doar exemple.

Ce returnează

Un long: milisecunde (currentTimeMillis) sau nanosecunde (nanoTime).

Exemple

Exemplul 1: Valorile brute

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        long ms = System.currentTimeMillis();
        System.out.println(ms);
        System.out.println(Instant.ofEpochMilli(ms));
        System.out.println(System.nanoTime());
    }
}

Rezultat posibil (diferă la fiecare rulare)

1792405867123
2026-10-19T09:51:07.123Z
518734992817250

Exemplul 2: Cât durează un calcul

Măsurăm cu nanoTime și transformăm în milisecunde. Durata exactă diferă la fiecare rulare.

public class Main {
    public static void main(String[] args) {
        long start = System.nanoTime();
        long suma = 0;
        for (int i = 0; i < 100_000_000; i++) {
            suma += i % 7;
        }
        long durata = System.nanoTime() - start;
        System.out.println("Suma: " + suma);
        System.out.printf("Durata: %.1f ms%n", durata / 1_000_000.0);
    }
}

Rezultat posibil (diferă la fiecare rulare)

Suma: 299999997
Durata: 41.7 ms

Exemplul 3: O pauză măsurată

Aici afișăm doar verificări, deci rezultatul este același la fiecare rulare.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        long startMs = System.currentTimeMillis();
        long startNs = System.nanoTime();
        Thread.sleep(200);
        long ms = System.currentTimeMillis() - startMs;
        long ns = System.nanoTime() - startNs;
        System.out.println("Cel puțin 200 ms (currentTimeMillis): " + (ms >= 199));
        System.out.println("Cel puțin 200 ms (nanoTime): " + (ns >= 200_000_000L));
    }
}

Rezultat

Cel puțin 200 ms (currentTimeMillis): true
Cel puțin 200 ms (nanoTime): true

Greșeli frecvente

  • Măsori durate cu currentTimeMillis(): dacă ceasul sistemului se ajustează în timpul măsurătorii, durata poate ieși greșită sau chiar negativă. Folosește nanoTime().
  • Afișezi nanoTime() ca oră: valoarea nu are legătură cu data curentă.
  • Măsori o singură rulare a unui cod foarte rapid: JVM-ul compilează codul treptat, iar primele rulări sunt mai lente. Pentru măsurători serioase folosește un instrument ca JMH.

Comenzi înrudite

  • Thread.sleep: sleep() oprește firul curent pentru un timp; interrupt() trimite unui fir semnalul să se oprească din așteptare.
  • System: Clasa care leagă programul de sistem: ieșirea standard (out), ieșirea de erori (err), intrarea (in), timpul, variabilele și setările.
  • Runtime.totalMemory: totalMemory() dă memoria rezervată acum de JVM, freeMemory() cât din ea este liberă; diferența este memoria folosită.