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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

2回答

2270閲覧

NSDateとNSTimerを使用しての経過時間の表示方法について

mm--_--mm

総合スコア113

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

0クリップ

投稿2016/03/07 03:56

編集2016/03/07 03:59

いつもお世話になっております。

現在、SDateとNSTimerを使用してタイマーアプリを作成していて、表記方法を23:59:59の1秒後は00:00:00と表示したいのですが、現在だと24:00:00と表示されてしまいます。
この問題を解決する方法を教えていただければ幸いです。

よろしくお願いいたします。
ソースコードは秒数変換をして表示する箇所だけですが以下の通りになってます。

objective

1 2- (void)timeCounter{ //タイマーが起動してから1秒ごとに呼ばれる 3 4 double cTime = [NSDate timeIntervalSinceReferenceDate] - start_time; //秒数変換する 5 int day = cTime / (( 60 * 60 ) * 24); 6 int hour = cTime / ( 60 * 60 ); 7 int minute = fmod(cTime , (60 * 60 )) / 60; 8 int second = fmod(cTime, 60); 9 10 [dayLabel setText:[NSString stringWithFormat:@"%d日", day]]; 11 timerLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d",hour,minute, second]; 12 13}

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

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

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

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

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

guest

回答2

0

minuteとsecondはfmodを使っているのに、なぜhourでは使わないのですか?

#基本的な考え方

例えば、10万秒について考えてみます。

10万秒は何日か?
10万秒を1日の秒数で割ります。
1日の秒数 = 606024
100000 / (606024) = 1.157...
整数部だけ取り出して「1日」となります。
元の10万秒から「1日」の秒数を引きます。
100000 - (606024)*1 = 13600

次は時間です。
13600秒は何時間か?
13600秒を1時間の秒数で割ります。
1時間の秒数 = 6060
13600 / (60
60) = 3.777...
整数部だけ取り出して「3時間」となります。
元の13600秒から「3時間」の秒数を引きます。
13600 - (60*60)*3 = 2800

次は分です。
2800秒は何分か?
2800秒を1分の秒数で割ります。
1分の秒数 = 60
2800 / 60 = 46.666...
整数部だけ取り出して「46分」となります。
元の2800秒から「46分」の秒数を引きます。
2800 - 60*46 = 40

次は秒です。
残っている40秒をそのまま使います。

ということで、10万秒 = 1日3時間46分40秒 となります。

これをそのままコードにすると、

objectivec

1int t = [NSDate timeIntervalSinceReferenceDate] - start_time; 2 3//何日か? 4int d = t / (60*60*24); 5t -= d * (60*60*24); 6 7//何時間か? 8int h = t / (60*60); 9t -= h * (60*60); 10 11//何分か? 12int m = t / 60; 13t -= m * 60; 14 15//何秒か? 16int s = t;

んでもって、これをカッコ良く仕上げるとhirahasuさんの書いたコードになります。
(途中で引き算をする代わりにfmod(整数なら%演算子)を使う)

投稿2016/03/07 04:21

編集2016/03/07 09:07
fuzzball

総合スコア16731

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

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

mm--_--mm

2016/03/07 04:27

ご回答いただきありがとうございます。 ここの部分は自分でもよく意味が分かっておらず、サンプルにあったものをコピペして使っているだけです... fmodを使用すれば解決するのでしょうか?
fuzzball

2016/03/07 04:39

解決するのでがんばって下さい。
mm--_--mm

2016/03/07 04:40

なるほど... わかりました!頑張ります!
fuzzball

2016/03/07 09:07

ちょっと心配になったので追記しておきました。
mm--_--mm

2016/03/07 13:34

返信が遅れてしまい申し訳ありません...わざわざ追記までして下さり大変感謝しております。自分で解決してみようと必死だったので追記してくださった事に気が着きませんでした... 自分で色々やってみて24時間後どういった表記になるか試してる途中ですので、それまでの間に追記してくださった事を理解しようと思います。いつも丁寧に対応してくださりありがとうございます!
fuzzball

2016/03/07 15:09

本当に24時間待たなくてもw cTime = 60*60*24; として確かめるとか、 過去のNSDateを作ってstart_timeに代入するとか、 int i = 0; while (true) { cTime = i; /* 計算と表示 */ i++; } などとしてグルグル回すとか。
mm--_--mm

2016/03/08 05:16

そのような確かめ方は思い浮かばなかったです... 自宅に帰り次第、試してみようと思います!ありがとうございます!
mm--_--mm

2016/03/08 12:54

hour = fmod(cTime, 60 * 60);として cTimeに86400と表示したら1日と00:00:00と表示されたので cTimeに86399という値を代入したところ 3599:59:59と表示されてしまいました... どうしたら良いでしょうか? そもそも計算式がまちがってるのでしょうか?
fuzzball

2016/03/08 12:58

ちなみにfmodの意味は分かっているのでしょうか?
mm--_--mm

2016/03/08 13:28

fmod(x,y);だとするとx/yのあまりをdouble型で返すという事だと思ってますが...
mm--_--mm

2016/03/08 13:38

さっきの自分の書き込みで、なぜ3599が表示されるか気がつきました...(汗) もう一回考え直します。下らない質問してしまいすみません...
fuzzball

2016/03/08 13:51 編集

とにかく動くコードが必要というなら私が回答に書いたコードを使っていただくとして、ちょっとした問題を出してみます。 Q. 任意の数字の百の位を求める方法を考えてみて下さい。例えば、任意の数字を1234とすると、2を返すような関数(式)です。 時間だと桁の繰り上がりが60だったり24だったりとややこしいですが、 十進数の数字なら全ての桁が10で繰り上がるので考えやすいでしょう。 別に答えていただなかなくてもかまいません。もし興味があればということで。 私からの回答はこれにて終了とします。 【追記】 入れ違いになったので追記します。 まぁ時間があるならゆっくり考えてみて下さい。 cTimeに入れる値を色々変えてみるだけでも気が付くことはあると思います。 (そういう意味では、86399でチェックしてみたのは大正解です)
mm--_--mm

2016/03/08 14:04

これは趣味で作ってるアプリなのでゆっくり考えてみます。 そしてその問題も考えてみます。次に書き込むのがこの二つの問題が解けたときに書き込みます。色々とありがとうございました!
guest

0

日付・時間関係は、NSDateだけでなく、NSDateFormatter、NSDateComponents、NSCalendarクラスの使用をお勧めします。ロケールの問題やグレゴリウス暦や和暦(慶応など明治より前も対応可)等の問題もクラス側で解決してもらえるのでよけいなコードがなくなります。

質問に関する事項だと

swift

1let now = NSDate() 2let dateFormatter = NSDateFormatter() 3dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") 4dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" 5print(dateFormatter.stringFromDate(now))

みたいなコードになります。
また日付計算はNSDateComponentsを使います。閏年等もクラス側で処理されます。

上述クラス名で検索すれば、使い方はいろいろ出てきます。

int day = cTime / (( 60 * 60 ) * 24);

int hour = cTime / ( 60 * 60 );

ちなみに上の式だと時間については所期の目的を達しないのでは?1日半経過すると1日と12時間という表示ではなく,1日と36時間という表示になってしまいます。

投稿2016/03/07 04:51

編集2016/03/07 10:14
NCC1701

総合スコア1680

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

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

mm--_--mm

2016/03/07 13:30

ご回答いただきありがとうございます。返信が遅れてしまい申し訳ありません.... なるほど!NSDateクラスについては、まだまだ勉強不足で理解していない部分が沢山あるのでこれからの開発に参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問