アプリケーションを実行すると、現在の日時を示すコードがあります
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
今それは私を示しています:それを実行すると2012/12/11 00:36:53.
しかし、それを実行中に時間をカウントしたいと思います。
したがって、例として00:37:53で実行すると、今回は表示されますが、開始時に00:37:53が必要であり、00:40:55で実行を停止します。 00:37:53、00:37:54、00:37:55というように表示されます。
どうすればこれを行うことができますか?
javax.swing.Timer
? (インポートを間違えないでください。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();
}
これにより、毎秒ActionListenerの本体が実行され、現在の時刻が出力されます。
Thread.join
最後の行での呼び出しは普遍的に必要なわけではありません。プロセスが手動で停止されるまで、このコード例を実行する必要があるだけです。それ以外の場合は、すぐに停止します。
実際のアプリケーションでは、それがSwingアプリである場合、タイマーはそれ自体でスレッド化を処理する必要があるため、心配する必要はありません。
上記のサンプルをアプリケーションに統合するのは非常に簡単です。initGUI
メソッドに追加し、現在の時刻をSystem.outセットに出力する代わりに、指定されたラベルのテキストを変更します。
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();
}
Swing 、 [〜#〜] swt [〜#〜] 、 Vaadin のように、ユーザーインターフェイスの技術的なプラットフォームについて言及していません、ウェブなど。したがって、これらの詳細については触れません。ここでの基本的なアプローチは、すべてのUIテクノロジーに適用されます。
2つの基本的なアイデア:
Swingの場合、Swingタイマーが適切な場合があります(そのテクノロジーの現在のステータスがわからない)。しかし、それ以外の場合は、ScheduledExecutorService
を使用して別のスレッドで現在の瞬間を繰り返しキャプチャする方法を学びます。 Stack Overflowを検索して、Executor
の詳細を確認してください。
Instant
クラスを使用して、タイムライン上の現在の瞬間をUTCでナノ秒までの解像度でキャプチャします。
Instant now = Instant.now();
そのオブジェクトをUIスレッドに渡します。
UIスレッドで、ユーザーの希望/予想タイムゾーンZoneId
を適用してZonedDateTime
を作成します。
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZobedDateTime zdt = instant.atZone( z ) ;
その日時を表す文字列が必要な場合は、toString
を呼び出すか、DateTimeFormatter
を使用します。 ofLocalized…
メソッド(DateTimeFormatter
)。
詳細については、スタックオーバーフローで何百もの関連する質問と回答を検索してください。
これを試すことができます
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();
}
}
このプログラムを実行して、出力を取得できます。
日付と時刻の詳細については、Javaのリンクを参照してください。
https://docs.Oracle.com/javase/tutorial/datetime/iso/datetime.html
https://docs.Oracle.com/javase/7/docs/api/Java/sql/Date.html
形式としてhh:mmを使用した単純な日付フォーマッターを使用します。
SimpleDateFormat sdf = new SimpleDateFormat("HH:MM a");
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();
}
時間を継続的に変更(毎秒更新)
Incrementステートメントを使用してループを追加すると、クロックは指定された条件になるまで時を刻み続けます。