質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

4回答

2107閲覧

sleepやtimerを使わず計算で日時の取得を連続で行いたいです。

raki_

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/08/19 11:42

編集2020/08/25 11:42

前提・実現したいこと

学校の課題で、1秒毎に日時を表示させ30秒間表示し終了と言うプログラムを組んでいるのですが、
if文を使って1秒後の表示をする事が出来たのですが、30秒間表示が出来ず詰まっています。

該当のソースコード

以下サンプル

import java.util.Calendar; import java.text.SimpleDateFormat; public class Sample{ public static void main(String[]args){ SimpleDateFormat d = new SimpleDateFormat ("yyyy/MM/dd HH:mm:ss"); Calendar c1 = Calendar.getInstance(); int s1 = c1.get(Calendar.SECOND); Calendar c2 = Calendar.getInstance(); int s2 = c2.get(Calendar.SECOND); long s3 = c2.getTimeInMillis() - c1.getTimeInMillis(); while(c2.getTimeInMillis() < c1.getTimeInMillis() + 30000){ if(c2.getTimeInMillis() == c2.getTimeInMillis() + 1000){ System.out.println(d.format(s2.getTime())); } } }

補足情報(FW/ツールのバージョンなど)

ツールはjavaを使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2020/08/19 13:55

「1秒ごとに日時を表示する」というのは、本当に実時間で1秒ごと間隔をあけて出力するという事なのですか? 単に「1秒刻みの日時を表示する」という意味ではないのでしょうか? 表示される日時が1秒刻みであれば、表示は一瞬でいいのではないのですか?
raki_

2020/08/20 06:03

はい、実時間で1秒毎に間隔を空けて出力です。 その際に2つの時刻の差を計算する必要があります…
guest

回答4

0

学校の課題だったら、このくらい使うものが少ないのかなぁ。

java

1public static void main(String[] args) { 2 SimpleDateFormat d = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 3 4 String prev = ""; 5 // while(System.currentTimeMillis() % 1000 != 0); // 2回目の表示を1秒後にするためwait 6 for(int i = 0; i < 30;) { // 30回=30秒 表示(30回表示だと29秒か・・・) 7 String now = d.format(new Date()); 8 if(!prev.equals(now)) { // 秒が変わったら 9 i++; // i のインクリメントはforでなく、ここで行う 10 System.out.println(now); 11 prev = now; 12 } 13 } 14}

投稿2020/08/19 22:05

編集2020/08/19 23:52
momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2020/08/19 22:11

> 注意事項として、sleep等で時間を止めず計算で日時を表示させたいです。 あ、計算してないからダメか・・・
momon-ga

2020/08/19 23:01 編集

あ、念のため。 これ1秒おきに表示でなく、文字列の秒が変わったタイミングで表示です。 なので、2回目の表示が1秒未満になります。 まぁ、学校の課題なんで、そんなん気にしないでしょぐらいの感じね。 ”計算で日時を表示”という注意事項があるのは上記の実装じゃダメってことかもしれませんね
guest

0

一応、これでお望みの動作になっていると思います。
Dateクラスで現在ミリ秒を取得して、それに30秒分足したのをendTimeとしています。
そして現在ミリ秒を1000で割って余りがない場合にコンソールに出力していますが、
そのままだと1ミリ秒の間に複数回出力が走ってしまうので、
holdTimeに現在秒を保持し、1ミリ秒経って差分が出るまではcontinueで処理を止めます。
と、まあ何とも美しくない出来です。
これより綺麗に書ける方がいましたらお願いします。

java

1SimpleDateFormat d = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 2long nowTime = (new Date()).getTime(); 3long endTime = nowTime + (30 * 1000); 4long holdTime = -1; 5while (nowTime < endTime) { 6 if (nowTime == holdTime) { 7 nowTime = (new Date()).getTime(); 8 continue; 9 } 10 if (nowTime % 1000 == 0) { 11 holdTime = nowTime; 12 System.out.println(d.format(new Date(nowTime))); 13 } 14 nowTime = (new Date()).getTime(); 15}

投稿2020/08/19 13:39

yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

勘違いだったら申し訳ないのですが、1秒毎に日時を表示させながら、他の処理を同時に行いたいということでしょうか。それならばjava.lang.Threadクラスを利用することで実現することができます。以下に例を示します。

java

1import java.text.SimpleDateFormat; 2import java.util.Date; 3 4public class Main { 5 6 public static void main(String[] args) { 7 System.out.println("Hello"); 8 9 new Thread(() -> { 10 try { 11 SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 12 for (int i = 0; i < 30; i++) { 13 System.out.println(formatter.format(new Date())); 14 Thread.sleep(1000); 15 } 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 }).start(); 20 21 System.out.println("World!"); 22 } 23}

実行結果は以下のようになります。

Hello World! 2020/08/19 22:36:33 2020/08/19 22:36:34 2020/08/19 22:36:35 2020/08/19 22:36:36 2020/08/19 22:36:37 2020/08/19 22:36:38 2020/08/19 22:36:39 2020/08/19 22:36:40 2020/08/19 22:36:41 2020/08/19 22:36:42 2020/08/19 22:36:43 2020/08/19 22:36:44 2020/08/19 22:36:45 2020/08/19 22:36:46 2020/08/19 22:36:47 2020/08/19 22:36:48 2020/08/19 22:36:49 2020/08/19 22:36:50 2020/08/19 22:36:51 2020/08/19 22:36:52 2020/08/19 22:36:53 2020/08/19 22:36:54 2020/08/19 22:36:55 2020/08/19 22:36:56 2020/08/19 22:36:57 2020/08/19 22:36:58 2020/08/19 22:36:59 2020/08/19 22:37:00 2020/08/19 22:37:01 2020/08/19 22:37:02

また、本当はこのようなコードはCPUを消費するためよくないのですが、sleepを使わない例もお見せします。

java

1import java.text.SimpleDateFormat; 2import java.util.Date; 3 4public class Main { 5 6 public static void main(String[] args) { 7 8 SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 9 10 long endTime = System.currentTimeMillis() + 30000; 11 long shownTime = 0; 12 13 while (endTime > shownTime) { 14 if (System.currentTimeMillis() < shownTime + 1000) continue; 15 shownTime = System.currentTimeMillis(); 16 System.out.println(formatter.format(new Date(shownTime))); 17 } 18 } 19} 20

投稿2020/08/19 13:38

編集2020/08/19 15:04
Toshimichi

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raki_

2020/08/20 00:46

回答ありがとうございます もし、これを自分が投稿したような形で行う場合はどのような形になるでしょうか…
guest

0

「sleep等で時間を止めず」というのが課題の一部ならともかく、そうでないなら素直にsleepさせるべきです。

無限ループなどで待ち続けることでも時間は過ぎては行きますが、そのようなやり方はビジーループと呼ばれ、「待っている間CPUの利用率が跳ね上がってしまう」など、効率面から言って好ましくありません。

投稿2020/08/19 12:01

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raki_

2020/08/19 12:53

回答ありがとうございます。 そうですね、それも課題の一部です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問