teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

考え方。

2016/03/07 09:07

投稿

fuzzball
fuzzball

スコア16733

answer CHANGED
@@ -1,1 +1,60 @@
1
- minuteとsecondはfmodを使っているのに、なぜhourでは使わないのですか?
1
+ minuteとsecondはfmodを使っているのに、なぜhourでは使わないのですか?
2
+
3
+ #基本的な考え方
4
+
5
+ 例えば、10万秒について考えてみます。
6
+
7
+ 10万秒は何日か?
8
+ 10万秒を1日の秒数で割ります。
9
+ 1日の秒数 = 60*60*24
10
+ 100000 / (60*60*24) = 1.157...
11
+ 整数部だけ取り出して「1日」となります。
12
+ 元の10万秒から「1日」の秒数を引きます。
13
+ 100000 - (60*60*24)*1 = 13600
14
+
15
+ 次は時間です。
16
+ 13600秒は何時間か?
17
+ 13600秒を1時間の秒数で割ります。
18
+ 1時間の秒数 = 60*60
19
+ 13600 / (60*60) = 3.777...
20
+ 整数部だけ取り出して「3時間」となります。
21
+ 元の13600秒から「3時間」の秒数を引きます。
22
+ 13600 - (60*60)*3 = 2800
23
+
24
+ 次は分です。
25
+ 2800秒は何分か?
26
+ 2800秒を1分の秒数で割ります。
27
+ 1分の秒数 = 60
28
+ 2800 / 60 = 46.666...
29
+ 整数部だけ取り出して「46分」となります。
30
+ 元の2800秒から「46分」の秒数を引きます。
31
+ 2800 - 60*46 = 40
32
+
33
+ 次は秒です。
34
+ 残っている40秒をそのまま使います。
35
+
36
+ ということで、10万秒 = 1日3時間46分40秒 となります。
37
+
38
+ これをそのままコードにすると、
39
+
40
+ ```objectivec
41
+ int t = [NSDate timeIntervalSinceReferenceDate] - start_time;
42
+
43
+ //何日か?
44
+ int d = t / (60*60*24);
45
+ t -= d * (60*60*24);
46
+
47
+ //何時間か?
48
+ int h = t / (60*60);
49
+ t -= h * (60*60);
50
+
51
+ //何分か?
52
+ int m = t / 60;
53
+ t -= m * 60;
54
+
55
+ //何秒か?
56
+ int s = t;
57
+ ```
58
+
59
+ んでもって、これをカッコ良く仕上げるとhirahasuさんの書いたコードになります。
60
+ (途中で引き算をする代わりにfmod(整数なら%演算子)を使う)