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

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

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

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

Q&A

解決済

5回答

15909閲覧

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

ryo_se

総合スコア68

Java

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

0グッド

0クリップ

投稿2015/09/18 02:11

お世話になっております。
JAVAの数値による時間計算を行っているのですが、
行き詰まってしまい、助力をお願いしたく存じます。

該当の処理は時間を4ケタの数字で表しており、
13時50分なら1350と表記します。

例えば13時から16時30分までの差分を求め、さらにそこから40分引くといった処理を行うとします。
結果としては2時間50分となりますが、

1630-1300 = 330;
330-40 = 290

ここで40分を引く
290 -40 = 250 ⇒2時間50分

下2ケタが60以上の場合、時間形式に合わせるように40足すか引くという動作を行うのですが、
これがどういったパターンで足すか引くかを判別すればいいのかがわかりません。

Calendarクラスに落とし込む方法も少し考えたのですが、
22時から25時までのように次の日にもつれこむパターンもあるため、
処理が難しくなると思い、実装していません。

ご教授のほどお願いいたします。

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

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

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

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

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

guest

回答5

0

「時間形式に合わせるように40足すか引く」というような場当たり的な対応を行うと、認識していなかった場合にバグを生む元です。

入出力を4桁の数字で行うのはいいとしても、関数内部では「時の60倍+分」というような統一的な形式で持つことで、加減算を素直に行えるようになります。「4桁で入力」→「時の60倍+分に変換」→「加減算」→「4桁形式に戻す」というような流れがいいでしょう。

投稿2015/09/18 02:21

maisumakun

総合スコア145184

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

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

0

Calendarクラスはデフォルトでは非厳密モードで,例えば「25時」と設定された場合は「翌日の1時」と自動で解釈されます.同じように月・日・時・分・秒などの時間フィールドは自動で繰り上がるので,翌日にまたがる場合でもCalendarクラスで問題なく処理できます.

投稿2015/09/18 02:55

swordone

総合スコア20651

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

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

0

「時間」と「分」を別々に考えるからややこしくなります。
入力を一旦全部「分」に直して計算し、出力の際に4桁に戻せば楽です。

わざわざ自作するならこんな感じでしょうか。

java

1Time t1 = Time.CreateFrom(1630); //内部で16*60+30[min]を持つ 2Time t2 = Time.CreateFrom(1300); //内部で13*60+30[min]を持つ 3TimeSpan ts = TimeSpan.CreateFromMinutes(40) //内部で40[min]を持つ 4TimeSpan dt = t1.minus(t2).minus(ts); //内部の分単位の数値を計算 5int x = dt.to4Digit();

言語は問いません。時間どうしの計算のアルゴリズムについて

投稿2015/09/18 02:36

編集2015/09/18 02:45
ozwk

総合スコア13521

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

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

0

Calenderオブジェクトには、日時をミリ秒で表したものを取得できるgetTime()メソッドがあります。これを利用して差分を取得すれば、日を跨がっても問題ありません。

java

1 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 2 Date toDate = null; 3 Date fromDate = null; 4 5 // 日付を作成します。 6 try { 7 fromDate = sdf.parse("2015-09-17 23:00"); 8 toDate = sdf.parse("2015-09-18 05:30"); 9 } catch (ParseException e) { 10 } 11 12 // 日時をミリ秒で取得 13 long to = toDate.getTime(); 14 long from = fromDate.getTime(); 15 16 // 差分を分単位で計算 17 long diff = (to - from) / (1000 * 60 ); 18 System.out.println("分単位の差分: " + diff);

投稿2015/09/18 02:32

shanxia

総合スコア1038

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

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

0

ベストアンサー

あまり美しくはないですが、単純に考えるならば分単位に直して計算すれば良いのではないでしょうか。

java

1int time1 = 1630; 2int time2 = 1300; 3int time1min = time1 / 100 * 60 + time1 % 100; // 分単位に変換 4int time2min = time2 / 100 * 60 + time2 % 100; // 分単位に変換 5 6int resultmin = time1min - time2min - 40; 7int result = resultmin / 60 * 100 + resultmin % 60; // 元の形式に戻す

汎用性を高めるために、時←→分の変換はメソッド化しておくと良いでしょう。

投稿2015/09/18 02:21

編集2015/09/18 02:22
hy3

総合スコア594

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

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

ryo_se

2015/09/18 04:51

ありがとうございます!ずっと悩まされていたので解決いたしました! 一番わかりやすく、簡単だった様をベストアンサーにさせていただきます。 他の皆様も貴重なご意見誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問