Java afficher 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 quand je l'exécute.
Mais je veux qu'il compte le temps pendant son exécution.
Donc par exemple maintenant quand je l'exécute sur 00:37:53 il montre cette fois, mais je veux 00:37:53 au démarrage et j'arrête de l'exécuter sur 00:40:55 . Je veux qu'il me montre 00:37:53, 00:37:54, 00:37:55 et ainsi de suite.
Maintenant, comment puis-je faire cela?
5 answers
Que diriez-vous d'utiliser une minuterie, telle que javax.swing.Timer
? (Ne faites pas d'erreur dans l'importation, il y a plus de classes de minuterie.)
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, en imprimant l'heure actuelle.
L'appel Thread.join
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, il serait immédiatement arrêter.
Dans une application réelle, au cas où c'est un Swing app, alors la minuterie devrait gérer le filetage par elle-même, de sorte que vous n'aurez pas à vous en soucier.
Modifier
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 sur le système.set de modifier le texte de l'étiquette:
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();
}
Vous ne mentionnez pas la plate-forme technique de votre interface utilisateur, tels que Swing, SWT, Vaadin, web, et ainsi de suite. Donc, je ne vais pas aborder ces détails. L'approche de base s'applique ici à toutes les technologies d'interface utilisateur.
Deux idées de base:
- Créez un élément dans votre interface utilisateur pour représenter le moment actuel. Peut - être une étiquette de texte ou un widget fantaisie tel qu'un cadran d'horloge animé.
- Fil 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 de l'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 testamentaire
Pour Swing, la minuterie Swing peut être appropriée (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 le moment actuel. La Recherche De La Pile Déborder pour en savoir beaucoup plus à ce sujet Executor
.
Java.temps
Utilisez la classe Instant
pour capturer le moment actuel sur la timeline en UTC avec une résolution allant jusqu'à nanosecondes.
Instant now = Instant.now();
Passez cet objet au thread de l'interface utilisateur.
Sur le thread de l'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
. Notez les méthodes ofLocalized…
sur DateTimeFormatter
.
Recherchez Stack Overflow pour plusieurs centaines de questions et réponses connexes pour plus de détails.
Utilisez un formateur de date simple avec hh:mm comme format.
SimpleDateFormat sdf = new SimpleDateFormat("HH:MM a");
Ajoutez une boucle avec une instruction increment, de sorte que l'horloge continuera à cocher jusqu'à condition donnée.
Vous pouvez essayer ceci,
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'infos sur la date et l'heure en 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