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

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

ただいまの
回答率

90.61%

  • Java

    13522questions

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

  • MySQL

    5701questions

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

  • JSP

    908questions

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

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

受付中

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,921

Sfidante

score 89

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

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

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

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

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

---------------------------------------------------------------

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

方針としては・・・

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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を引数として動作する以下のような関数です。
// long ではなくTimeStampやDate型でも可
public void CountDown(long time)
{
    // ここに処理を移植しましょう
    // System.out.printlnが希望の動作になれば完成
}

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

Calendar calendar = Calendar.getInstance();
// 72時間後…とりあえずしあさっての日付を入れてみよう。
calender.set(2015, 5-1, 8);

// 今の時間から5月8日になるまでの時間が表示されれば完成!
CountDown(calender.getTimeInMillis()); 

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

以下のSQL文なら、1クエリで"残り時間"を取得できます。
SELECT TIMEDIFF(DATE_ADD(basis, INTERVAL 3 DAY), NOW()) period FROM tbl;

mysql> CREATE TABLE tbl (basis DATETIME);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO tbl VALUES (now());
Query OK, 1 row affected (0.00 sec)

mysql> SELECT TIMEDIFF(DATE_ADD(basis, INTERVAL 3 DAY), NOW()) timeLeft FROM tbl;
+----------+
| timeLeft |
+----------+
| 71:32:43 |
+----------+
1 row in set (0.00 sec)

Javaコードの方は、フレームワークなどを使用しているか否か不明なので何とも言えませんが、
以下のような感じでいかがでしょうか?
String timeLeft = getTimeLeftFromDB(); // 上記SQL文を使用して、残り時間を取得する。
String chunk = timeLeft.split(":");
System.out.println(chunk[0] + "時間" + chunk[1] + "分" + chunk[2] + "秒後");

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

getTime()で返すのは「ミリ秒」なので,加える時間は「秒」から更に3桁上げる必要があります.
long time = timeStamp.getTime() + 259200000; //259200秒 * 1000
時,分の計算が不自然な感じがします.以降,ミリ秒なのでtimeSec→timeMilliSecとします.
        //時間を割り出す
        long hour = timeMilliSec / 3600000; //1時間=3600秒=3600000ミリ秒で時に直す
        //分を割り出す
        long min = (timeMilliSec / 60000) % 60; //1分=60000ミリ秒で分に直し,60で割った余り
        //秒を割り出す
        long sec = (timeMilliSec / 1000) % 60; //1秒=1000ミリ秒で秒に直し,60で割った余り

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    [JAVA] 4ケタの数値による時間計算

    お世話になっております。 JAVAの数値による時間計算を行っているのですが、 行き詰まってしまい、助力をお願いしたく存じます。 該当の処理は時間を4ケタの数字で表しており、 13

  • 解決済

    java 日付の取得と変更について

    javaの日付の取得と変更に関するコードについて質問です 参考書のとおりに、下記のコードを書いて実行してみたのですが 実行してみても、現在の日付から5日後の日付が出力されず、現在

  • 解決済

    JavaのcurrentTimeMillisとWin32APIのGetSystemTimeが一致しな...

    JavaのcurrentTimeMillisで取得した値はWin32APIのGetSystemTimeで取得した値を元にmktimeで算出した値と一致すると思っていたのですが、違う

  • 受付中

    javaである期間の経過年月日時分秒を算出したい

    下記のようなStringで与えられる年月日時分秒 "2014/12/20 23:45:23"と 現在の時刻を比較し、 与えられた時刻から現在までyy年mmか月dd日 hh時間

  • 受付中

    JAVA dateの複数のデータの時刻だけを加算するには

    date型で 複数の日時と時刻が含まれるデータがあります、これをjavaで全部足して合計時間を出すにはどうすればいいでしょうか。 例えば 2016-2-25 06:30:10

  • 受付中

    GMTの時刻文字列をJSTの時刻文字列に変換するスマートな方法

    DBに格納されたGMTの時刻文字列をJSTの時刻文字列に変換したいのですが、スマートなやり方を教えてほしいです。 DateFormat df = new SimpleDate

  • 解決済

    MySQL

    oooooooooooooooooooooooooooooooooooooooo

  • 解決済

    指定日までのカウントダウン

    指定した日をダイアログボックスに入力し、ボタンを押下すると現在から指定までのカウントダウンを行うアプリを開発したいです。 インターネットの情報を参考に作成しようとしているので

同じタグがついた質問を見る

  • Java

    13522questions

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

  • MySQL

    5701questions

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

  • JSP

    908questions

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