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

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

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

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

Q&A

解決済

4回答

2303閲覧

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

tvivo

総合スコア16

Java

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

0グッド

0クリップ

投稿2018/05/17 02:10

質問させてください。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; } } }

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

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

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

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

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

guest

回答4

0

Java8のLocalTimeとDurationを使用

java

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

投稿2018/05/17 15:45

swordone

総合スコア20651

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

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

tvivo

2018/05/22 05:52

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

0

Java

1String str1 = br.readLine(); 2String str2 = br.readLine(); 3String str3 = br.readLine(); 4 5int hour = Integer.parseInt(str1); 6int minute = Integer.parseInt(str2); 7int second = Integer.parseInt(str3); 8 9LocalTime result = LocalTime.now().minusHours(hour).minusMinutes(minute).minusSeconds(second); 10System.out.println(result.format(DateTimeFormatter.ofPattern("HH時mm分ss秒")));

投稿2018/05/17 02:38

root_jp

総合スコア4666

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

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

tvivo

2018/05/17 04:37

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

0

ベストアンサー

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

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 04:11

編集2018/05/17 04:14
tkturbo

総合スコア5572

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

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

tvivo

2018/05/17 04:34

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

0

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

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

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

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

ですので

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

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

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

投稿2018/05/17 02:53

KSwordOfHaste

総合スコア18394

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

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

tvivo

2018/05/17 04:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問