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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

4回答

724閲覧

32時間制で時間の計算をする方法

tanuki_

総合スコア35

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2024/09/04 03:20

実現したいこと

25:00ー24:00を計算した時に60分が求められるようにしたい。

発生している問題・分からないこと

Date型を使って時間の差分(分)を求めたいのですがうまくいかず1日嵌まっています。

該当のソースコード

java

1 DateFormat df1 = new SimpleDateFormat("yyyyMMdd"); 2 String Day = df1.format(reserveDay); 3 data.setDateOfUse(Day + startHour + startMinute + "00"); 4 //利用時間 5 DateFormat df = new SimpleDateFormat("yyyyMMddHHmm"); 6 Date StartTime = null; 7 if(Integer.parseInt(startHour) >= 24){ 8 startHour = String.valueOf(Integer.parseInt(startHour) - 24); 9 } 10 try { 11 StartTime = df.parse(Day + startHour + startMinute); 12 } catch (ParseException e) { 13 e.printStackTrace(); 14 } 15 Date EndTime = null; 16 String endHour = String.valueOf(endHourText.getText()); 17 String endMinute = String.valueOf(endMinuteText.getText()); 18 Date reserveEndDay = new Date(); 19 String EndDay = null; 20 if(Integer.parseInt(endHour) >= 24) { 21 endHour = String.valueOf(Integer.parseInt(endHour) - 24); 22 if(Integer.parseInt(endHour) >= 0 && Integer.parseInt(endMinute) > 0) { 23 Calendar calendar = Calendar.getInstance(); 24 calendar.setTime(reserveDay); 25 calendar.add(Calendar.DAY_OF_MONTH, 1); 26 reserveEndDay = calendar.getTime(); 27 EndDay = df1.format(reserveEndDay); 28 }else{ 29 EndDay = df1.format(reserveDay); 30 } 31 }else{ 32 EndDay = df1.format(reserveDay); 33 } 34 try { 35 EndTime = df.parse(EndDay + endHour + endMinute); 36 } catch (ParseException e) { 37 e.printStackTrace(); 38 } 39 long wkTime = EndTime.getTime() - StartTime.getTime(); 40 int OfUse = (int) (wkTime / 1000 / 60 / 60);

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

reserveDay=20240904
startHour=24
startMinute=00
endHour=25
endMinute=00
とした時に
上記の処理で現在OfUseに60以外が入ってきます。

補足

特になし

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

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

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

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

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

jimbe

2024/09/04 05:44 編集

時間の計算だけでしたら Calendar や Date を使うよりも直接 hour*60+minute で開始も終了も数値にして引き算したほうが簡単な気がしますが。 各入力の値の範囲は幾つから幾つまでを想定されていますか? 何かの GUI 内のコードの一部のようですが、まず時間差を求めるメソッドとして抜き出したほうが良いと思います。 その上で、単体テストとして main からそのメソッドを呼ぶような構造にすれば、動作確認もし易くなるのではないでしょうか。
tanuki_

2024/09/04 07:21

コメントありがとうございます。ご指摘事項を試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
otn

2024/09/04 13:20

> 32時間制で時間の計算をする方法 というのは、1日が24時間でなく36時間であるという意味になりますが、そういう意図で合ってますか? それだと、既存の日時ライブラリは使えませんね。 あるいは、1日は24時間だけど、25:00 - 24:00 を計算したいので、誤って「32時間制」と書いてしまったということなのでしょうか?
tmp

2024/09/05 03:17 編集

32時間制という表現は、初耳ですが、日付変更時刻が0:00でないものは、よく日跨ぎするデータにあるので、多分、32時間制は、日付変更時刻が8時だという意味で08:00から31:59で表す日時だと思います。 ただ、ずらしたからといって日跨ぎしないわけではないので、単純に引き算すると開始が31:00で終了が10:00だと、マイナスになってしまいます。単純に経過時間の問題だと+24するだけですが。そもそも、そんなデータは、発生しないから書いてないのかもしれませんね。 で、32時間制を想像してみましたが・・・・カイジの地下帝国ならありえそうw
shiketa

2024/09/05 04:33

内部的には24時間制(?)なフツーの日時として保持し、表現するときに32時間制の日時として表現すればいいだけだとおもいますけどね。 内部的には 2024-09-05 01:00 と保持しておき、表現したいときに 2024-09-04 25:00 とすればいいだけのような。 ま、わたしならそうするかなというだけのはなしです。
otn

2024/09/05 13:06

> 32時間制は、日付変更時刻が8時だという意味で08:00から31:59で表す日時だと思います。 なるほど。そういうルールでやることはありますけど、それを「32時間制」とか言うのは初めて聞きました。 私はごく普通に「朝8時で日付変更」とか言ってましたね。 メインフレームOS(私が知っている範囲だと日立VOS3)だと、日付変更コマンドを入れないと、システム日時が延々と同じ日付で時刻だけ増えていくという設定に出来たはず。システム日付を参照する夜間バッチが朝まで掛かる場合とか用。もしかして日付変更コマンドを入れるんじゃなくてOS再起動だったかも。
guest

回答4

0

Androidいけるなら、Kotlinもいけますよね。表現を32時間制にする LocalDateTime32、みたいなクラスを定義する、とか。

kotlin

1import java.time.Duration 2import java.time.LocalDate 3import java.time.LocalDateTime 4import java.time.chrono.ChronoLocalDateTime 5import java.time.temporal.Temporal 6import java.time.temporal.TemporalAccessor 7import java.time.temporal.TemporalAdjuster 8 9object Testes { 10 /** 11 * 32時間制 12 */ 13 data class LocalDateTime32( 14 private val _dt: LocalDateTime 15 ) : 16 Temporal, 17 TemporalAccessor, 18 TemporalAdjuster, 19 Comparable<ChronoLocalDateTime<*>>, 20 ChronoLocalDateTime<LocalDate> 21 by _dt { 22 // 23 val hour = _dt.hour.let { hh -> if (hh < 8) hh + 24 else hh } 24 25 // 26 override fun toString(): String = 27 "%sT%02d:%02d:%02d".format(toLocalDate(), hour, _dt.minute, _dt.second) 28 29 // 30 override fun toLocalDate(): LocalDate = _dt.toLocalDate().minusDays(if (hour < 24) 0 else 1) 31 32 // 33 fun toLocalDateTime(): LocalDateTime = _dt 34 35 // 36 companion object { 37 // 38 fun of(year: Int, month: Int, dayOfMonth: Int, 39 hour: Int, minute: Int, second: Int): LocalDateTime32 { 40 require((0..32).contains(hour)) 41 42 val date = LocalDate.of(year, month, dayOfMonth) 43 44 return LocalDateTime32( 45 date.atStartOfDay() 46 .plusHours(hour.toLong()) 47 .plusMinutes(minute.toLong()) 48 .plusSeconds(second.toLong()) 49 ) 50 } 51 } 52 } 53 54 55 @JvmStatic 56 fun main(args: Array<String>) { 57 val dt1 = LocalDateTime.of(2024, 1, 3, 12, 34, 45) 58 val dt2 = LocalDateTime.of(2024, 1, 5, 23, 32, 21) 59 60 println(Duration.between(dt1, dt2)) 61 println(Duration.between(dt2, dt1)) 62 63 println("--") 64 65 (0..32).forEach { 66 println( 67 LocalDateTime32.of(2023, 12, 31, it, 32, 21) 68 ) 69 } 70 71 println("--") 72 73 val dt3 = LocalDateTime32.of(2024, 1, 5, 11, 32, 21) 74 val dt4 = LocalDateTime32.of(2024, 1, 5, 31, 32, 21) 75 println(dt3) 76 println(dt4) 77 println(Duration.between(dt3, dt4)) 78 } 79}

投稿2024/09/05 12:23

shiketa

総合スコア4036

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

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

0

わざわざ 24 を超える時間を指定可能というのは日を跨いだ時の時間計算を楽にするためなので、 24 を超えた場合どうこうという if を入れる必要は無いでしょう。

java

1 /** 2 * 利用時間(分) 3 */ 4 private int usageTimeAtMinute(String startHour, String startMinute, String endHour, String endMinute) { 5 int start = Integer.parseInt(startHour, 10) * 60 + Integer.parseInt(startMinute, 10); 6 int end = Integer.parseInt(endHour, 10) * 60 + Integer.parseInt(endMinute, 10); 7 return end - start; 8 }

投稿2024/09/04 08:15

jimbe

総合スコア13115

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

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

0

25:00ー24:00を計算した時に60分が求められるようにしたい。

SimpleDateFormatは25時でも通りませんか?(いいのか悪いのか^^;

int OfUse = (int) (wkTime / 1000 / 60 / 60);

分が欲しいんですよね?割りすぎていませんか?

java

1import java.text.*; 2import java.util.Date; 3//import java.util.concurrent.TimeUnit; 4 5public class Sample { 6 public static void main(String[] args) throws ParseException { 7 DateFormat df = new SimpleDateFormat("yyyyMMddHHmm"); 8 9 Date StartTime = df.parse("202409042400"); 10 Date EndTime = df.parse("202409042500"); 11 12 System.out.println(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(EndTime)); // 2024/09/05 01:00 13 14 long wkTime = EndTime.getTime() - StartTime.getTime(); 15 int OfUse = (int) (wkTime / 1000 / 60); 16// int OfUse = (int) TimeUnit.MINUTES.convert(wkTime, TimeUnit.MILLISECONDS); 17 18 System.out.println(OfUse); // 60 19 } 20}

投稿2024/09/04 06:05

TN8001

総合スコア9727

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

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

0

java.util.Dateでわなく、java.timeパッケージを使うとラクできるでしょう。

$ jshell jshell> import java.time.* jshell> var reserveDay = LocalDate.of(2024,9,4) reserveDay ==> 2024-09-04 jshell> var start = reserveDay.atStartOfDay().plusHours(24).plusMinutes(0) start ==> 2024-09-05T00:00 jshell> var end = reserveDay.atStartOfDay().plusHours(25).plusMinutes(0) end ==> 2024-09-05T01:00 jshell> var ofUse = Duration.between(start, end).toMinutes() ofUse ==> 60

投稿2024/09/04 05:50

shiketa

総合スコア4036

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問