Eu sei como fazer um temporizador de 1 dígito [1:9:0], mas como eu posso fazer um temporizador de 2 dígitos [19:39:01] sem usar um monte de condições?
Como vc fez esse de 1 dígito?
public static void main(String[] args) throws InterruptedException {
int s = 0;
int m = 0;
int h = 0;
for (int i = 0; i < 10000; i++) {
s++;
if (s == 60) {
s = 0;
m++;
}
if (m == 60) {
m = 0;
h++;
}
System.out.println("[" + h + ":" + m + ":" + s + "]");
Thread.sleep(1000);
}
}
Você percebe que ele imprime no começo 0:0:1, mas eu queria ter uma ideia de como imprimir com 2 dígitos 00:00:01
Você pode utilizar a classe LocalTime (https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html) para isto!
Um exemplo seria:
class Main {
public static void main(String[] args) throws InterruptedException {
while (true) {
Thread.sleep(1000);
timeCounter();
}
}
public static void timeCounter() {
LocalTime time = LocalTime.now();
int hor = time.getHour();
int min = time.getMinute();
int sec = time.getSecond();
StringBuilder sb = new StringBuilder();
sb.append("[").append((hor < 10) ? "0"+hor : hor)
.append(":").append((min < 10) ? "0"+min : min)
.append(":").append((sec < 10) ? "0"+sec : sec)
.append("]");
System.out.println(sb.toString());
}
}
Isso funciona com um efeito similar, atente-se a parte do código onde eu construo a string com o StringBuilder, é usado operadores ternários para fazer uma avaliação, se o número for menor que 10, adicione um zero na frente.
While (true)
, como funciona isso?
E o que o String builder?
Esta é uma forma de criar um loop infinito.
O código que vc mostrou vai rodar por apenas um certo perido de tempo (10000 minutos) e vai parar.
Usando um loop infinito, seu contador só pararia caso o programa fosse encerrado ou caso uma certa condição dentro do loop seja satisfeita. Por exemplo:
while(true) {
s++;
if (s == 60) {
s = 0;
m++;
}
if (m == 60) {
m = 0;
h++;
}
if (h == 3) {
break;
}
}
O código acima pararia apenas depois de 3 horas terem se passado, isso acontece por causa do break
.
Strings em Java são imutaveis e cada vez que vc as concatena, uma String completamente nova é criada e isso pode ser custoso quando vc faz varias concatenações sucessivas.
O StringBuilder
é uma forma mais eficiente pra vc realizar essas concatenações.
Sobre seu código
Seu código está perfeito do jeito que está, a única mudança que vc precisa fazer é usar o printf
no lugar do println
. Ficaria assim:
public static void main(String[] args) throws InterruptedException {
int s = 0;
int m = 0;
int h = 0;
while (true) {
s++;
if (s == 60) {
s = 0;
m++;
}
if (m == 60) {
m = 0;
h++;
}
System.out.printf("[%02d:%02d:%02d]\n", h, m, s);
Thread.sleep(1000);
}
}
Créditos: O truque com %02d
eu descobri hoje bem aqui: https://stackoverflow.com/a/473309/3334365