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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Q&A

5回答

13114閲覧

Javaでカウントダウンタイマーを作りたい!!

Sfidante

総合スコア90

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

0グッド

0クリップ

投稿2015/05/04 04:50

編集2022/01/12 10:55

プログラミング初心者で色々とWebサイトを見て
勉強しているのですが、
いまいち掴めないのでこちらで質問させて頂きます。

やりたいことはカウントダウンタイマーです。

基準となる時間はMySQLに格納してある
datetime型(Javaではtimestamp型?)の時間です。
その時間に72時間追加して基準の時間とします。
その時間と現在の時間の差を求めて
「◯◯時間◯◯分◯◯秒」という形で表示したいです。
上記の時間の更新のタイミングは
ページを更新したタイミングで
表示時間が変わるようにしたいです。

データベースから、「2015-05-01 10:20:30」取得したとして、
どのようなコードを書けばよいのかご教授頂けるとありがたいです。

全て任せてしまうような形になってしまいますが、
何卒よろしく御願い致します。


以下、コードを追加します。

自分なりにこういった流れで処理すればよいのかなといった形で
書いてみたので、これはおかしいという点がありましたら、
ご教授願います。

lang

1public static void main(String[] args) { 2 //データベースからDateTime型で取得して 3 //それをTimestamp型へと変換する 4 5 //そのTimestamp型をSystem.currentTimeMillis()が入っているところへ格納する 6 Timestamp timeStamp = new Timestamp(System.currentTimeMillis()); 7 //データベースの時間に72時間(256200秒)追加する 8 long time = timeStamp.getTime() + 259200; 9 //今の時間を出す 10 long timeNow = timeStamp.getTime(); 11 //そのデータベースの時間と今の時間の差分を秒単位で出す 12 long timeSec = (time - timeNow); 13 //時間を割り出す 14 double hour = (double)timeSec/3600; 15 //分を割り出す 16 double min = (hour - (long)hour)*60; 17 //秒を割り出す 18 long sec = Math.round((min - (long)min)*60); 19 //それぞれを表示 20 System.out.println((long)hour + "時間" + (long)min + "分" + sec + "秒後"); 21 }

現状、ある理由でデータベースへ繋げないので、
今の時間と比較しているため、
全く更新されないです・・・

一番苦労するであろうDateTimeからTimestamp型への変換がまだなので不安ですが
この段階で間違っている点をご教授下さい。
よろしく御願い致します。

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

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

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

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

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

guest

回答5

0

以下のSQL文なら、1クエリで"残り時間"を取得できます。

SQL

1SELECT TIMEDIFF(DATE_ADD(basis, INTERVAL 3 DAY), NOW()) period FROM tbl;

SQL

1mysql> CREATE TABLE tbl (basis DATETIME); 2Query OK, 0 rows affected (0.01 sec) 3 4mysql> INSERT INTO tbl VALUES (now()); 5Query OK, 1 row affected (0.00 sec) 6 7mysql> SELECT TIMEDIFF(DATE_ADD(basis, INTERVAL 3 DAY), NOW()) timeLeft FROM tbl; 8+----------+ 9| timeLeft | 10+----------+ 11| 71:32:43 | 12+----------+ 131 row in set (0.00 sec)

Javaコードの方は、フレームワークなどを使用しているか否か不明なので何とも言えませんが、
以下のような感じでいかがでしょうか?

Java

1String timeLeft = getTimeLeftFromDB(); // 上記SQL文を使用して、残り時間を取得する。 2String chunk = timeLeft.split(":"); 3System.out.println(chunk[0] + "時間" + chunk[1] + "分" + chunk[2] + "秒後");

ちなみに、
"プログラムで3日(に相当するミリ秒)を足して3日後の時間を計算する"
のは、うるう秒に対応できないので、タイマーに求められる精度によっては不適切な手段です。

投稿2015/09/27 12:37

KiyoshiMotoki

総合スコア4791

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

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

0

分かっているのかもしれませんが、今の時間を出す処理もSystem.currentTimeMillis()の値が必要です。
timeStampの値をMySQLの値に単に変更しただけではあげられたコードは動作しません。

2つアドバイスがあります。

1つめ。
今回 GoUsami さんが作りたい処理は、以下の2つからなります。

1.基準時間を求める処理
1-1.MySQLから値を取得
1-2.値に72時間追加する
2.カウントダウン処理
2-1.基準時間と現在の時間の差を出力する

基準時間を求めるために72時間追加する処理と、カウントダウン処理は直接関係ありません。
この2つは分けて考えましょう。

2つめ。
2番の、カウントダウン処理だけを書いてみましょう。
カウントダウンは「現在時刻と基準時間の差を求めること」ですよね。

基準時間まであと2時間、基準時間まであと3時間…

基準時間を引数とし、カウントダウンするだけの関数をまずは作ってみてください。
上の例で言えば、timeを引数として動作する以下のような関数です。

lang

1// long ではなくTimeStampやDate型でも可 2public void CountDown(long time) 3{ 4 // ここに処理を移植しましょう 5 // System.out.printlnが希望の動作になれば完成 6}

カウントダウンタイマーの動作自体は、MySQLから値を取得する処理を書く前にテストできます。
この関数が完成したら、自分でDate型の値を作ってテストしてみるといいでしょう。

lang

1Calendar calendar = Calendar.getInstance(); 2// 72時間後…とりあえずしあさっての日付を入れてみよう。 3calender.set(2015, 5-1, 8); 4 5// 今の時間から5月8日になるまでの時間が表示されれば完成! 6CountDown(calender.getTimeInMillis());

同じように、データベースへつなげるようになった時にはまず1番の処理のみ作りましょう。
時刻を取得して72時間足し、希望通りの基準時間が作れるかテストします。
両方とも希望通りの動作にできたら、最後に両者を繋げればカウントダウンタイマーの完成です。

投稿2015/05/05 04:07

編集2015/05/05 04:10
haru666

総合スコア1591

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

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

0

getTime()で返すのは「ミリ秒」なので,加える時間は「秒」から更に3桁上げる必要があります.

lang

1long time = timeStamp.getTime() + 259200000; //259200秒 * 1000

時,分の計算が不自然な感じがします.以降,ミリ秒なのでtimeSec→timeMilliSecとします.

lang

1 //時間を割り出す 2 long hour = timeMilliSec / 3600000; //1時間=3600秒=3600000ミリ秒で時に直す 3 //分を割り出す 4 long min = (timeMilliSec / 60000) % 60; //1分=60000ミリ秒で分に直し,60で割った余り 5 //秒を割り出す 6 long sec = (timeMilliSec / 1000) % 60; //1秒=1000ミリ秒で秒に直し,60で割った余り

投稿2015/05/04 13:21

swordone

総合スコア20649

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

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

0

方針としては・・・

  1. MySQLのDateTimeをTimestamp型に変換(誰もが一度は陥る日付処理。)
  2. 1.で得られたTimestampからgetTime()してミリ秒を取得,これに72時間に相当するミリ秒を加算し基準の時間にする
  3. ページを更新するタイミングでSystem.currentTimeMillis()によりミリ秒時間を取得し,2.との差を算出し,時・分・秒に分割して表示する

2.と3.で違う方法で時刻を設定していますが,基準時間はどちらも同じ(1970年1月1日午前0時)ですので問題ないはずです.

投稿2015/05/04 09:23

swordone

総合スコア20649

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

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

0

コードをまるまる書くとあなたの勉強にならないので、
手順だけ書きます。

いろいろやり方ありますが、
mysqlでやるならTIMEDIFF関数を利用して、現在時刻から三日以内のレコードをとればよいでしょう。
javaでやるなら、取得したDate型をunixタイムに変換して差分抽出して日付だすと良いかとおもいます。

投稿2015/05/04 07:59

tyoku

総合スコア67

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問