web-dev-qa-db-fra.com

Java affiche l'heure actuelle

J'ai un code qui me montre la date et l'heure actuelles lorsque j'exécute mon application

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

Maintenant, il me montre: 2012/12/11 00:36:53 lorsque je l'exécute.

Mais je veux qu'il compte le temps pendant son exécution.

Donc, par exemple maintenant, lorsque je l'exécute à 00:37:53, cela s'affiche cette fois, mais je veux 00:37:53 au démarrage et j'arrête de l'exécuter à 00:40:55. Je veux que ça me montre 00:37:53, 00:37:54, 00:37:55 et ainsi de suite.

Maintenant, comment puis-je faire cela?

12
user1809035

Que diriez-vous d'utiliser une minuterie, comme javax.swing.Timer ? (Ne vous trompez pas dans l'importation, il y a plus de classes Timer.)

public static void main(String... args) throws InterruptedException {
    final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    int interval = 1000; // 1000 ms

    new Timer(interval, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Calendar now = Calendar.getInstance();
            System.out.println(dateFormat.format(now.getTime()));
        }
    }).start();

    Thread.currentThread().join();
}

Cela exécutera simplement le corps de l'ActionListener chaque seconde, imprimant l'heure actuelle.

Le Thread.join l'appel sur la dernière ligne n'est pas universellement nécessaire, il est juste nécessaire pour que cet exemple de code s'exécute jusqu'à ce que le processus soit arrêté manuellement. Sinon, cela s'arrêterait immédiatement.

Dans une application réelle, dans le cas où il s'agit d'une application Swing, le minuteur doit gérer le filetage seul, vous n'aurez donc pas à vous en soucier.


Éditer

L'intégration de l'exemple ci-dessus dans votre application est assez simple, ajoutez-le simplement dans la méthode initGUI et au lieu d'imprimer l'heure actuelle dans System.out, modifiez le texte de l'étiquette donnée:

public void initGUI() {
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        
    setPreferredSize(new Dimension(800, 600));
    setLayout(null);

    Calendar now = Calendar.getInstance();
    tijd = new JLabel(dateFormat.format(now.getTime()));
    tijd.setBounds(100, 100, 125, 125);
    window.add(tijd);

    new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Calendar now = Calendar.getInstance();
            tijd.setText(dateFormat.format(now.getTime()));
        }
    }).start();

    pack();
}
6
Natix

Vous ne mentionnez pas la plateforme technique de votre interface utilisateur, telle que Swing , SWT , Vaadin , Web, etc. Je n'aborderai donc pas ces détails. L'approche de base ici s'applique à toutes les technologies d'interface utilisateur.

Deux idées de base:

  • Créez un élément dans votre interface utilisateur pour représenter l'instant actuel. Il peut s'agir d'une étiquette de texte ou d'un widget sophistiqué tel qu'un cadran d'horloge animé.
  • Le thread d'arrière-plan capture régulièrement le moment actuel pour une mise à jour de l'affichage de cet élément d'interface utilisateur. Soyez prudent dans la façon dont le thread d'arrière-plan atteint le thread d'interface utilisateur. Utilisez la technique d'interface utilisateur appropriée pour communiquer la nouvelle valeur date-heure et provoquer la mise à jour du widget d'interface utilisateur.

Exécuteur

Pour Swing, le Swing Timer peut être approprié (pas sûr de l'état actuel de cette technologie). Mais sinon, apprenez à utiliser un ScheduledExecutorService pour qu'un thread séparé capture à plusieurs reprises l'instant actuel. Recherchez Stack Overflow pour en savoir plus sur ce Executor.

Java.time

Utilisez la classe Instant pour capturer l'instant actuel sur la timeline en UTC avec une résolution allant jusqu'à nanosecondes.

Instant now = Instant.now();

Passez cet objet au thread d'interface utilisateur.

Sur le thread d'interface utilisateur, appliquez le fuseau horaire souhaité/attendu de l'utilisateur ZoneId pour produire un ZonedDateTime.

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZobedDateTime zdt = instant.atZone( z ) ;

Si vous avez besoin d'une chaîne pour représenter cette date-heure, appelez toString ou utilisez DateTimeFormatter. Remarquez le ofLocalized… méthodes sur DateTimeFormatter.

Recherchez Stack Overflow pour plusieurs centaines de questions et réponses connexes pour plus de détails.

2
Basil Bourque

Vous pouvez essayer ça,

import Java.awt.*;
import Java.awt.event.*;
import Java.util.Date;
import Java.lang.Thread;

public class TimeInSeconds extends Frame implements Runnable
{
    private Label lblOne;
    private Date dd;
    private Thread th;

    public TimeInSeconds()
    {
        setTitle("Current time");
        setSize(200,150);
        setVisible(true);
        setLayout(new FlowLayout());
        addWindowListener(new WindowAdapter() {
            public void windowClose(WindowEvent we){
                System.exit(0);
            }
        });
        lblOne = new Label("00:00:00");
        add(lblOne);

        th = new Thread(this);
        th.start(); // here thread starts
    }

    public void run()
    {
        try
        {
            do
            {
                dd = new Date();
                lblOne.setText(dd.getHours() + " : " + dd.getMinutes() + " : " + dd.getSeconds());
                Thread.sleep(1000);  // 1000 = 1 second
            }while(th.isAlive());
        }
        catch(Exception e)
        {

        }
    }

    public static void main(String[] args)
    {
        new TimeInSeconds();
    }
}

Vous pouvez exécuter ce programme et obtenir la sortie.

Pour plus d'informations sur la date et l'heure dans Java vous pouvez consulter les liens ci-dessous,

https://docs.Oracle.com/javase/tutorial/datetime/iso/datetime.html

https://docs.Oracle.com/javase/7/docs/api/Java/sql/Date.html

http://www.flowerbrackets.com/date-time-Java-program/

1
Shiva

Utilisez un formateur de date simple avec hh: mm comme format.

SimpleDateFormat sdf = new SimpleDateFormat("HH:MM a");

Cliquez ici pour le programme complet.

0
user2824143
    public void ShowTime() {
        new Timer(0, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Date d = new Date();
                SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyy hh:mm:ss a");
                time.setText(s.format(d));                 //time= jlabel 
            }
        }).start();
    }

Changer l'heure en continu (rafraîchir toutes les secondes)

0
Anupam 1

Ajoutez une boucle avec une instruction d'incrémentation, de sorte que l'horloge continue de tourner jusqu'à la condition donnée.

0
user6514497