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

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

ただいまの
回答率

88.06%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,383
退会済みユーザー

退会済みユーザー

例えば12:34(12時34分)から01:47(一時間47分)マイナスするとします。
そうすると10:47(10時47分)になりますがこのような計算をプログラムで実行することは可能ですか?超ほんの少しならイメージは頭に浮かびますが説明はできません。時間と分をわけて何かをするのかな?と思いますが...
変数,if文を使うのかなぁと思いますが...
もしコードを書いてくださるのならできればjava,javascript,php,swift,c,c++が嬉しいですがなんでもいいです、それよりもアルゴリズムが気になりますのでフロートチャートで説明して欲しいです。図々しくてすいません😞
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+4

すでにBA出てしまっていますが。
Javaの場合は Joda Time か、Java8から標準搭載された DateTime APIを使うとできます。

以下は標準のDateTime APIを使った例です。
// Java8以降

// import java.time.*;
// import java.time.temporal.*;

LocalTime time = LocalTime.of(12, 34);
TemporalAmount amt = Duration.ZERO.plusHours(1).plusMinutes(47);
LocalTime time2 = time.minus(amt);
System.out.println(time2); // => 10:47

アルゴリズムは大雑把に言うとozwkさんの書かれているC#版と同じような感じだと思います。
内部的に統一された単位(秒+ナノ秒)に変換してから計算しています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/08 15:28

    ありがとうございます。JAVAで検索してもなかなか出なかったので助かりました。

    キャンセル

checkベストアンサー

+3

C#な上にアルゴリズムも糞も無いのですが。

DateTime t = DateTime.Now; //時刻:現在
TimeSpan dt = TimeSpan.FromSeconds(10); //時間:十秒
Console.WriteLine((t + dt).ToString()); //現在時刻の10秒先

とまあ標準で思いっきり実装されています。

まあこれだと聞きたいことに答えていないと思うので
実装がどうなっているか覗いてみます:
public struct DateTime : IComparable, IFormattable,...
{
...
    private UInt64 dateData;
                                       
    // Constructs a DateTime from a tick count. The ticks
    // argument specifies the date as the number of 100-nanosecond intervals
    // that have elapsed since 1/1/0001 12:00am.
    //
    public DateTime(long ticks) {
        if (ticks < MinTicks || ticks > MaxTicks)
            throw new ArgumentOutOfRangeException(...
        Contract.EndContractBlock();
        dateData = (UInt64)ticks;               
    }
...
時刻をある地点から最小単位(1tick = 100ns)で保持して計算しているようです。
雑に言えば、12時34分は12*60+34=754分として、
1時間47分=107分を引きます。
その後、表示等で必要になれば時分単位にして返します。
これをものすごく細かい単位でやってるだけです。

DateTimeの内部実装

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/08 00:42

    わかりやすい回答ありがとうございます。質問なんですがMath関数とか色々名前はありますがそれにも名前はありますか?

    キャンセル

  • 2015/05/08 00:43

    と思ったらDateTimeとかいてありましたね><
    すいません....

    キャンセル

-3

時間同士の計算は、日付が絡まないなら簡単ですが、日付が絡むとものすごく大変です。グレゴリオ暦の範囲だけでも、うるう秒、うるう年がありますし、まして、グレゴリオ暦以前の日付が絡んだりすると絶望的です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/08 15:27

    回答ありがとうございます。今回は日付が絡まないでただ単に時間だけの計算です。

    キャンセル

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

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

関連した質問

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