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

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

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

Q&A

解決済

1回答

1035閲覧

SwiftUI:タイマー設定

ttoo

総合スコア126

0グッド

0クリップ

投稿2021/08/25 14:04

下記リンクの書きコードの部分について、
こちらはなぜ出力結果を「minutes:seconds」とできるのでしょうか?
こちらがどうしても理解できず、ご教授いただきたいです。

let minutes = "((seconds % 3600) / 60)" let seconds = "((seconds % 3600) % 60)" let minuteStamp = minutes.count > 1 ? minutes : "0" + minutes let secondStamp = seconds.count > 1 ? seconds : "0" + seconds func start() { timerMode = .running timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in if self.secondsLeft == 0 { self.reset() } self.secondsLeft -= 1 }) }

https://www.dropbox.com/s/o3bkphiocvq5rpt/TimerAppEN.zip?dl=0&file_subpath=%2FTimerAppEN%2FTimerAppEN

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

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

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

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

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

hoshi-takanori

2021/08/25 23:21

seconds という変数名がかぶってるのでエラーになると思いますが、理解できないポイントはなぜ 3600 で割った余りをさらに 60 で割ったり余りを求めたりしてるかってことですか?
ttoo

2021/08/27 13:21

そうです、教えて欲しいです
hoshi-takanori

2021/08/27 14:23 編集

1 時間は 60 分、1 分は 60 秒なので、1 時間は 60 * 60 = 3600 秒です。 例えば 1 時間 23 分 45 秒は 1 * 3600 + 23 * 60 + 45 = 5025 秒で、これを 3600 で割った余り 1425 を 60 で割ると 23.75、小数点以下を切り捨てて 23 分、1425 を 60 で割った余りが 45 秒で、23:45 という出力が得られます。
ttoo

2021/08/27 14:26

なるほどです。。 ありがとうございます泣 クローズしたいので、別途回答お願いします汗
ttoo

2021/08/27 14:39

すいません、やっぱり質問です。 上記の場合ドキュメントで、わざわざ計算する意図がわかりません。 時間の指定はないですし、23 * 60 + 45だけで、23:45が指定できるのではないでしょうか?
guest

回答1

0

ベストアンサー

コンピューターの時刻の表し方は、ある時点 (iOS では UTC 1970 年 1 月 1 日 0 時) からの経過秒数で表すのが一般的です。(UTC は 協定世界時 と言って、イギリスのグリニッジ天文台の時間が元になってます。)

例えば日本時間 2021 年 8 月 27 日 12 時は 1630090800 です。この時刻に何か (お仕事でも勉強でもゲームでも) を始めて、現在の時刻が 1630100096 だとすると、

  • 経過秒数: 1630100096 - 1630090800 = 9296 秒
  • 時: 9296 / 3600 = 2.58、小数点以下を切り捨てて 2 時間
  • 分: 9296 を 3600 で割った余り 2096 を 60 で割って 34.93、34 分
  • 秒: 9296 を 3600 で割った余り 2096 を 60 で割った余り 56 秒

なので、2 時間 34 分 56 秒経過したことになります。このように、コンピューターの内部ではトータルの秒数しか持ってなくて (何時何分何秒という形で持ってると繰り上がりや時差の計算が面倒なので)、表示の際は秒数をもとに計算することになります。

なお、実際にこのような計算を行うコードを自分で書くのはバグの元なので、iOS では DateComponentsFormatter などを使うのがお勧めです。
参考: 【Swift】DateComponentsFormatterで「時間の量」を出力する - Qiita
参考: [Swift] DateComponentsFormatterやRelativeDateTimeFormatterを使って日付の差分を表示する - Qiita
参考: 【Swift】Dateの王道 【日付】 - Qiita

投稿2021/08/27 15:57

編集2021/08/27 15:59
hoshi-takanori

総合スコア7895

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

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

ttoo

2021/08/28 00:07

なるほどです!ありがとうございます( ^ω^ )
ttoo

2021/08/28 04:25

let minuteStamp = minutes.count > 1 ? minutes : "0" + minutes let secondStamp = seconds.count > 1 ? seconds : "0" + seconds すいません一点追加のご質問ですが、countはなぜ必要なのでしょうか?
hoshi-takanori

2021/08/28 04:50

その minutes や seconds は分や秒を文字列にしたもので、count はその長さ (文字数) です。分や秒が 1 桁しかない時に、0 を付けて 2 桁にしています。
ttoo

2021/08/28 06:31

なるほどです!ありがとうございます( ^ω^ )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問