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

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

ただいまの
回答率

90.53%

  • Java

    13740questions

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

java システム時刻から入力した時間

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 202

tvivo

score 4

質問させてください。javaをはじめ2週間くらいのものなので理解が遅いかもしれません。
システム時刻から入力した時刻を引いた時間を表示するという演習問題なのですが
フローを書き、なんとなくは自分なりにプログラムに起こしてみたのですがよくわかりません。
時刻がhh:mm:ss形式、時、分、秒の文字列に数字以外の文字が含まれていないこと
が条件となっています。
どのようにすれば解けるか、などの解答への導きやこの演習問題に模範解答がないので
自分のプログラムと見比べて考えるための模範解答などを教えてくれると嬉しいです。

package enshu;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Enshuu {
    public static void main(String[] args) throws IOException{
        int f;
        int g;
        int k;

        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str1=br.readLine();
        String str2=br.readLine();
        String str3=br.readLine();


        Date d = new Date();
        SimpleDateFormat d2 = new SimpleDateFormat("HHmmss");
        String c2 = d2.format(d);


        boolean check = Enshuu14Hhmms.timecheck(str1,str2,str3,c2);
        if(!check){
            return;
        }


        String str4 = str1 + str2 + str3;
        int dd = Integer.parseInt(str4);
        int ee = Integer.parseInt(c2);



        if(dd > ee){

                f = dd*3600*60-ee*3600*60;
        int hour = f / 3600;
            int min = (f%3600) / 60;
            int sec = f % 60;
            System.out.println(hour+"時"+min+"分"+sec+"秒");
        }else if(ee > dd){
            g = ee*3600*60-dd*3600*60;
            int hour = g / 3600;
            int min = (g%3600) / 60;
            int sec = g % 60;
            System.out.println(hour+"時"+min+"分"+sec+"秒");
        }
        else{
            k = 0;
            System.out.println("0時間0分0秒");
        }


    }

}

package enshu;

public class EnshuuHhmms {
    public static boolean timecheck(String h,String m,String s,String c2){
        try{

            String a = c2.substring(0,2);
            if(a.length()<2 || a.length()>2){
                System.out.println("error");
                return false;
        }
            String b = c2.substring(2,4);
            if(b.length()<2 || b.length()>2){
                System.out.println("error");
                return false;
            }
            String c = c2.substring(4,6);
            if(c.length()<2 || c.length()>2){
                System.out.println("error");
                return false;
            }
            if(h.length()<2 || h.length()>2){
                System.out.println("error");
                return false;
            }
            if(m.length()<2 || m.length()>2){
                System.out.println("error");
                return false;
            }
            if(s.length()<2 || s.length()>2){
                System.out.println("error");
                return false;
            }

            //入力
            Integer.parseInt(h);
            Integer.parseInt(m);
            Integer.parseInt(s);
            //システム
            Integer.parseInt(a);
            Integer.parseInt(b);
            Integer.parseInt(c);
            System.out.println("正常");
            return true;
        } catch (NumberFormatException e) {
            System.out.println("エラー");
            return false;
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+3

String str1 = br.readLine();
String str2 = br.readLine();
String str3 = br.readLine();

int hour = Integer.parseInt(str1);
int minute = Integer.parseInt(str2);
int second = Integer.parseInt(str3);

LocalTime result = LocalTime.now().minusHours(hour).minusMinutes(minute).minusSeconds(second);
System.out.println(result.format(DateTimeFormatter.ofPattern("HH時mm分ss秒")));

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/17 13:37

    ありがとうございます。
    参考にさせていただきます。

    キャンセル

+3

Java8のLocalTimeとDurationを使用

try (Scanner sc = new Scanner(System.in)) {
    LocalTime time = LocatTime.of(sc.nextInt(), sc,nextInt(), sc.nextInt());
    Duration d = Duration.between(time, LocalTime.now());
    System.out.println(d.toHours() + "時間" + (d.toMinutes() % 60) + "分" + (d.getSeconds() % 60) + "秒");
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/22 14:52

    ありがとうございます!!このような考え方もあるんですね!

    キャンセル

checkベストアンサー

+1

ざっと作ってみるとこんな感じ?

public class Enshuu {
    public static void main(String[] args) throws IOException{
        int f;
        int g;
        int k;

        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str1=br.readLine();
        String str2=br.readLine();
        String str3=br.readLine();

        // ここから下、改変
        try{
            /* 入力から時分秒生成 */
            Hhmmss hms1 = new Hhmmss(str1, str2, str3);

            /* 引数無しコンストラクタで現在の時分秒生成 */
            Hhmmss now = new Hhmmss();

            System.out.println(now.diff(hms1).toLocaleString());
        }catch(NumberFormatException e){
            System.out.println("error");
        }
    }
}

class Hhmmss{
    private int totalSeconds;

    public Hhmmss() throws NumberFormatException{
        Calendar c = Calendar.getInstance();
        this.setTotalSeconds(
                c.get(Calendar.HOUR_OF_DAY),
                c.get(Calendar.MINUTE), 
                c.get(Calendar.SECOND)
             );
    }

    private Hhmmss(int totalSeconds){
        this.totalSeconds = totalSeconds;
    }

    /* 閾値チェック付きSetter */
    private void setTotalSeconds(int hh, int mm, int ss) throws NumberFormatException {
        if(hh < 0 || hh > 23 
        || mm < 0 || mm > 59 
        || ss < 0 || ss > 59){
            throw new NumberFormatException("Wrong Number Format");
        }
        this.totalSeconds = (hh * 60 * 60 + mm * 60 + ss);
    }

    public Hhmmss(int hh, int mm, int ss) throws NumberFormatException {
        this.setTotalSeconds(hh, mm, ss);
    }

    /* 数値変換付きコンストラクタ */
    public Hhmmss(String hh, String mm, String ss) throws NumberFormatException {
        this(Integer.parseInt(hh, 10), 
             Integer.parseInt(mm, 10), 
             Integer.parseInt(ss, 10));
    }

    /** 差分計算 */
    public Hhmmss diff(Hhmmss another) {
        int sign = (this.totalSeconds < another.totalSeconds) ? -1 : 1;
        return new Hhmmss(sign * (this.totalSeconds - another.totalSeconds));
    }

    /** 文字列化 */
    public String toLocaleString(){
        int ss = this.totalSeconds % 60;
        int mm = this.totalSeconds / 60  % 60;
        int hh = this.totalSeconds / 60 / 60;

        return hh + "時間" + mm + "分" + ss + "秒";
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/17 13:34

    大変参考になります。
    自分で実行できるようになってから見比べてみようと思います。

    キャンセル

+1

多分Enshuu14HhmmsはEnshuuHhmmsのtypoですよね?

どのようにすれば解けるか

個人的な印象ですが、論理を作ることとメソッドなどのJavaの基本的な構文について基本を把握しておられるようなので、そろそろご自分でデバッグする訓練を始めるとよいと思います。

結果が期待外ですけど、こういう場合ソースを眺めていてもなかなかわからないです。その理由は「言語仕様を明確かつ正確に把握できてない」あるいはほぼ同じことですが「書いた論理が正確にどう動くか制御を正確に把握できない」ことに起因します。

ですので

(1) 中身の細かい動きがどうなっているかの事実を一つ一つ確認する
(2) 確認した事実が期待と異なることに気づいたときそれが何故かを考える

これの練習をするとプログラムを動かす力やひいてはコードを書く力がつくと思います。

例えば(1)は変数の内容をSystem.out.println(...)などを用いてコンソールに出力してみるというのが手軽に始められる第一歩だと思います。
mainメソッドの後半の論理にfやらhourやらの変数へ計算結果を代入していますね?それらの各々の変数の値をprintlnで表示し、「それがどういう値か」「なぜその値になるか」に取り組んでみましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/17 13:36

    デバック処理の訓練ですか。
    やってみようと思います!
    まずはsystem.out.println()で試しにこの問題でやってみようと思います。
    ありがとうございます。

    キャンセル

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

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

関連した質問

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

  • Java

    13740questions

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