Swiftで経過時間を表示するたったの10選

Swift言語での経過時間の表示方法のイラストSwift
この記事は約19分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swiftでアプリを開発していると、経過時間を表示するケースは多々あります。

例えば、タイマーアプリやログの時間表示など、さまざまな場面で利用することが考えられます。

この記事を読めばSwiftで経過時間を表示する10の方法を学ぶことができるようになります。

Swift初心者から中級者、上級者まで、すべてのレベルの開発者が学べる内容をまとめています。

●Swiftとは

SwiftはAppleが開発したプログラミング言語で、iOS、macOS、watchOS、tvOSなどのアプリケーション開発に使用されます。

Objective-Cに代わる新しい言語として2014年に発表され、その後のアップデートを経て多くの開発者に受け入れられるようになりました。

○Swiftの基本的な特徴

  1. 型安全性:Swiftは型安全な言語です。これにより、開発者はデータの種類を明確にすることができ、意図しないエラーを防ぐことが可能です。
  2. モダンな文法:Swiftの文法は、他の人気なプログラム言語にも似ており、読みやすく書きやすいのが特徴です。
  3. パフォーマンス:Swiftは高速で動作するように最適化されています。従って、動作が軽快なアプリケーションを作成することができます。
  4. オプショナル:Swiftにはオプショナルという機能があり、変数が値を持たない可能性を明示的に表すことができます。これにより、ランタイムエラーのリスクを低減することができます。

●経過時間を表示するための前提知識

Swiftで経過時間を表示するためには、DateクラスやDateFormatterをうまく利用する必要があります。

これらのクラスはSwiftの標準ライブラリに含まれており、日時の取得やフォーマット変更などの機能を提供しています。

○Dateクラスについて

Dateクラスは、日付と時間を管理するためのクラスです。

このクラスを利用することで、現在の日時を取得したり、特定の日時を作成したりすることができます。

このクラスを使って現在の日時を取得するコードを紹介します。

この例では、Dateクラスのインスタンスを作成して現在の日時を取得しています。

let currentDate = Date()
print(currentDate)

このコードを実行すると、現在の日時が表示されます。

Dateクラスは、1970年1月1日からの経過秒数をもとに日時を表現しています。

このため、特定の日時を表現したい場合や、2つの日時の差を計算したい場合などには、TimeIntervalという単位を使用します。

○DateFormatterについて

DateFormatterは、日時を特定のフォーマットの文字列として表示したり、文字列から日時を読み取ったりするためのクラスです。

これを利用することで、Dateクラスのインスタンスを任意の形式の文字列に変換することができます。

Dateクラスで取得した現在の日時を「YYYY年MM月DD日 HH時mm分ss秒」という形式で表示するコードを紹介します。

この例では、DateFormatterクラスを使って日時を指定したフォーマットに変換しています。

let currentDate = Date()

let formatter = DateFormatter()
formatter.dateFormat = "yyyy年MM月dd日 HH時mm分ss秒"

let dateString = formatter.string(from: currentDate)
print(dateString)

このコードを実行すると、例えば「2023年10月12日 12時30分45秒」といった形式で現在の日時が表示されます。

●経過時間の表示の基本

Swiftでアプリケーションを開発する際、経過時間の表示は多くの場面で重要な要素となります。

例えば、タイマーアプリや日時を扱うアプリでは、特定の日時からの経過時間や、2つの日時の差を計算し、それを適切な形式で表示する必要があります。

ここでは、Swiftで経過時間の表示を行う基本的な方法を、サンプルコードを交えて詳しく解説していきます。

○サンプルコード1:現在の日時を取得

まず、経過時間の表示を行う前に、現在の日時を取得する方法を紹介します。

SwiftではDateクラスを利用して簡単に現在の日時を取得することができます。

let now = Date()
print(now)

上記のコードでは、Dateクラスのインスタンスを作成し、それをnow変数に格納しています。

そして、その日時をprint関数を使ってコンソールに出力しています。

このコードを実行すると、例えば「2023-10-12 14:30:45 +0000」といった形で現在の日時が表示されるでしょう。

○サンプルコード2:特定の日時との差を表示

次に、特定の日時と現在の日時との差、つまり経過時間を計算して表示する方法を解説します。

ここでは、2023年1月1日から現在までの経過時間を計算する例を紹介します。

// 特定の日時を作成
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
if let startDate = formatter.date(from: "2023/01/01 00:00:00") {
    // 経過時間を計算
    let elapsedTime = Date().timeIntervalSince(startDate)

    // 経過時間を時、分、秒に変換
    let hours = Int(elapsedTime) / 3600
    let minutes = (Int(elapsedTime) % 3600) / 60
    let seconds = Int(elapsedTime) % 60

    print("2023年1月1日から現在までの経過時間: \(hours)時間\(minutes)分\(seconds)秒")
}

このコードではDateFormatterを使って特定の日時を作成し、現在の日時との差を計算しています。

そして、計算した経過時間を時、分、秒の単位に変換して表示しています。

このコードを実行すると、「2023年1月1日から現在までの経過時間: 286時間30分45秒」といった形で経過時間が表示されるでしょう。

●経過時間のフォーマット変更方法

Swiftを使用する際、経過時間をユーザーに適切に表示することは、アプリケーションのユーザビリティを高めるための重要な要素となります。

特に、経過時間のフォーマットは、ユーザーが情報を瞬時に理解できるように工夫が求められます。

ここでは、Swiftで経過時間のフォーマットを変更する方法について、サンプルコードを交えて詳しく解説していきます。

○サンプルコード3:経過時間を”時、分、秒”で表示

経過時間を”時、分、秒”の形式で表示することは、多くのアプリケーションで一般的です。

下記のサンプルコードは、経過時間をこの形式で整形して表示しています。

let elapsedTime: TimeInterval = 3665 // 1時間1分5秒

let hours = Int(elapsedTime) / 3600
let minutes = (Int(elapsedTime) % 3600) / 60
let seconds = Int(elapsedTime) % 60

print("\(hours)時間\(minutes)分\(seconds)秒")

このコードでは、総経過時間が3665秒と仮定しています。

そして、その経過時間を時、分、秒の単位に変換して、整形された文字列として出力しています。

このコードを実行すると、「1時間1分5秒」と表示されるでしょう。

○サンプルコード4:経過時間を”分、秒”で表示

一方、短い時間の経過を表示する場合、”分、秒”の形式での表示が適切な場合があります。

下記のサンプルコードは、経過時間をこの形式で整形して表示しています。

let shortElapsedTime: TimeInterval = 65 // 1分5秒

let shortMinutes = Int(shortElapsedTime) / 60
let shortSeconds = Int(shortElapsedTime) % 60

print("\(shortMinutes)分\(shortSeconds)秒")

このコードでは65秒という短い経過時間を”分、秒”の形式に変換しています。

このコードを実行すると、「1分5秒」と表示されるでしょう。

●経過時間の応用例

Swiftにおける経過時間の表示は、基本的な表示方法だけでなく、様々な応用が考えられます。

アプリケーションの使用シーンや要件に応じて、ユーザーにとって最も適切な表示を選択することが求められます。

ここでは、Swiftでの経過時間の表示の応用例を、具体的なサンプルコードを交えて解説していきます。

○サンプルコード5:起動からの経過時間を表示

アプリケーションの起動からの経過時間を表示する場面は多々あります。

下記のサンプルコードは、アプリの起動時からの経過時間を計測し、その時間を表示しています。

import Foundation

// アプリ起動時の日時を保存
let appLaunchDate = Date()

// 何らかの処理...

// 経過時間を計算
let elapsedTime = Date().timeIntervalSince(appLaunchDate)
let elapsedMinutes = Int(elapsedTime) / 60
let elapsedSeconds = Int(elapsedTime) % 60

// 経過時間を表示
print("\(elapsedMinutes)分\(elapsedSeconds)秒がアプリ起動から経過しました。")

このコードでは、アプリが起動された瞬間の日時をappLaunchDateに保存し、その後のある時点での経過時間を計算して表示しています。

このコードを実行すると、例えば「3分45秒がアプリ起動から経過しました。」というような結果が得られるでしょう。

○サンプルコード6:タイマー機能と経過時間の表示

アプリケーション内にタイマー機能を組み込みたい場合もあります。

下記のサンプルコードは、タイマーを起動し、一定間隔で経過時間を更新表示しています。

import Foundation

let timerStartDate = Date()
var elapsedTime: TimeInterval = 0

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    elapsedTime = Date().timeIntervalSince(timerStartDate)
    let elapsedMinutes = Int(elapsedTime) / 60
    let elapsedSeconds = Int(elapsedTime) % 60
    print("\(elapsedMinutes)分\(elapsedSeconds)秒")
}

// タイマーを10秒間実行
RunLoop.current.run(until: Date(timeIntervalSinceNow: 10))
timer.invalidate()

このコードを実行すると、タイマーが開始され、毎秒経過時間が更新されて表示されることとなります。

○サンプルコード7:特定のイベントからの経過時間を通知

特定のイベント(例:ユーザーがボタンを押す、通知が来るなど)からの経過時間を計測し、一定の時間が経過したら通知するといった機能を実装したい場合も考えられます。

下記のサンプルコードは、ユーザーが特定のアクションを起こしてからの経過時間を計測し、5秒後に通知しています。

import Foundation

// ユーザーのアクションが起こったと仮定して、その時点の日時を保存
let userActionDate = Date()

// 何らかの処理...

let elapsedTimeFromAction = Date().timeIntervalSince(userActionDate)
if elapsedTimeFromAction >= 5 {
    print("ユーザーアクションから5秒が経過しました。")
}

このコードを実行すると、「ユーザーアクションから5秒が経過しました。」というメッセージが表示されるでしょう。

このように、Swiftを使用して経過時間の応用例を実装することは、様々なシーンで非常に有効です。

●ユーザーインターフェースとの結合

Swiftを用いてアプリケーションの経過時間を表示する場合、単に計算した時間をコンソール上に表示するだけではなく、ユーザーインターフェース(UI)との結合が必要となります。

ここでは、SwiftのUI部品を使用して、経過時間を画面上に表示する方法について説明します。

○サンプルコード8:UILabelを使った経過時間の表示

SwiftでのUI部品の中で、テキスト情報を表示するものとしてUILabelがあります。

下記のサンプルコードは、アプリの起動からの経過時間をUILabelを用いて表示しています。

import UIKit

class ViewController: UIViewController {

    // UILabelを作成
    let elapsedTimeLabel = UILabel(frame: CGRect(x: 20, y: 50, width: 300, height: 50))
    let startTime = Date()

    override func viewDidLoad() {
        super.viewDidLoad()

        // ラベルの初期設定
        elapsedTimeLabel.text = "経過時間:0秒"
        self.view.addSubview(elapsedTimeLabel)

        // 1秒ごとにupdateLabel関数を呼び出すタイマーを設定
        Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateLabel), userInfo: nil, repeats: true)
    }

    @objc func updateLabel() {
        let elapsedTime = Int(Date().timeIntervalSince(startTime))
        elapsedTimeLabel.text = "経過時間:\(elapsedTime)秒"
    }
}

このコードは、アプリが起動された際にUILabelを画面上に配置し、その後1秒ごとに経過時間を更新してラベル上に表示するものです。

このコードを実行すると、アプリの画面上に「経過時間:n秒」という形式で経過時間が表示され、1秒ごとにその時間が更新されます。

○サンプルコード9:経過時間の更新をスムーズに行う方法

経過時間の表示をよりスムーズに行いたい場合、例えば0.1秒ごとに更新することで、動きを滑らかにすることができます。

下記のサンプルコードでは、0.1秒ごとに経過時間を更新し、UILabel上に表示しています。

import UIKit

class SmoothViewController: UIViewController {

    // UILabelを作成
    let elapsedTimeLabel = UILabel(frame: CGRect(x: 20, y: 50, width: 300, height: 50))
    let startTime = Date()

    override func viewDidLoad() {
        super.viewDidLoad()

        // ラベルの初期設定
        elapsedTimeLabel.text = "経過時間:0.0秒"
        self.view.addSubview(elapsedTimeLabel)

        // 0.1秒ごとにupdateLabel関数を呼び出すタイマーを設定
        Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateLabel), userInfo: nil, repeats: true)
    }

    @objc func updateLabel() {
        let elapsedTime = Date().timeIntervalSince(startTime)
        elapsedTimeLabel.text = String(format: "経過時間:%.1f秒", elapsedTime)
    }
}

このコードを実行すると、アプリの画面上に「経過時間:n.m秒」という形式で経過時間が表示され、0.1秒ごとにその時間が更新されることとなります。

これにより、経過時間の表示がよりスムーズに行われる効果が得られます。

●カスタマイズ方法

Swiftを用いて経過時間を表示する際、プロジェクトやアプリの要件に合わせて表示方法をカスタマイズすることがよく求められます。

ここでは、Swiftにおける経過時間の表示のカスタマイズ方法に焦点を当て、オリジナルな表示方法を作成する手順を解説します。

○サンプルコード10:自分だけのオリジナルな経過時間表示

デフォルトの経過時間表示だけでなく、例えば「経過した日数」や「経過した週数」を表示したいといった要件がある場合、カスタマイズが必要となります。

下記のサンプルコードでは、アプリの起動からの経過時間を「日、時、分、秒」の形式で表示するカスタマイズ方法を表しています。

import UIKit

class CustomTimeViewController: UIViewController {

    // UILabelを作成
    let elapsedTimeLabel = UILabel(frame: CGRect(x: 20, y: 50, width: 350, height: 50))
    let startTime = Date()

    override func viewDidLoad() {
        super.viewDidLoad()

        // ラベルの初期設定
        elapsedTimeLabel.text = "経過時間:0日 0時 0分 0秒"
        self.view.addSubview(elapsedTimeLabel)

        // 1秒ごとにupdateLabel関数を呼び出すタイマーを設定
        Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateLabel), userInfo: nil, repeats: true)
    }

    @objc func updateLabel() {
        let elapsedTime = Int(Date().timeIntervalSince(startTime))
        let days = elapsedTime / 86400
        let hours = (elapsedTime % 86400) / 3600
        let minutes = (elapsedTime % 3600) / 60
        let seconds = elapsedTime % 60

        // 経過時間を「日、時、分、秒」の形式で表示
        elapsedTimeLabel.text = "経過時間:\(days)日 \(hours)時 \(minutes)分 \(seconds)秒"
    }
}

このコードでは、アプリ起動からの経過時間を秒単位で計算し、それを「日、時、分、秒」の単位に変換しています。

このコードを実行すると、アプリの画面上に「経過時間:n日 m時 x分 y秒」という形式で経過時間が表示されます。

●注意点と対処法

Swiftで経過時間を計算・表示する際に注意すべき点と、それに対する対処法を解説します。

正確な経過時間を取得するために、これらの注意点を理解し、適切な対処を行うことが重要です。

○タイムゾーンの違いとその対処法

Swiftで日時を扱う際、タイムゾーンの違いが経過時間の計算に影響を与えることがあります。

特にグローバルに展開しているアプリでは、ユーザーが異なるタイムゾーンで使用する場合が考えられるため、注意が必要です。

この問題を解決するためには、Dateオブジェクトを使用する際にタイムゾーンを明示的に指定することが推奨されます。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
dateFormatter.timeZone = TimeZone(abbreviation: "UTC") // タイムゾーンをUTCに設定

let dateStr = "2023/04/01 12:00:00"
if let date = dateFormatter.date(from: dateStr) {
    print(date) // UTCの時間として解釈される
}

このコードでは、DateFormatterを使用して日時文字列をDateオブジェクトに変換する際に、タイムゾーンをUTCに設定しています。

これにより、タイムゾーンの違いによる誤差を防ぐことができます。

○経過時間の計算における誤差とその対処法

経過時間の計算には、実数を使用することが一般的ですが、コンピュータの計算上、極小な誤差が生じる可能性があります。

このような誤差は、経過時間の長期間の計算や、連続して経過時間を更新する際に蓄積されることがあります。

この問題を解決するための一つの方法は、経過時間の計算を整数のみで行うことです。

下記のサンプルコードは、起動からの経過時間を秒単位の整数として計算し、表示しています。

let startTime = Date()

// ... 何らかの処理 ...

let elapsedTime = Int(Date().timeIntervalSince(startTime))
print("経過時間:\(elapsedTime)秒")

このコードを実行すると、起動からの経過時間が秒単位の整数として正確に計算され、表示されます。

整数のみでの計算により、浮動小数点数に関連する誤差を回避することができます。

まとめ

Swiftでの経過時間の取得・表示に関して、多岐にわたる情報とサンプルコードを通して学んできました。

経過時間の基本的な取得方法から、フォーマット変更、応用例、ユーザーインターフェースとの結合、さらにはカスタマイズ方法、そして注意点と対処法まで、幅広く網羅的に解説を行いました。

特に、タイムゾーンの違いや計算上の誤差など、日時や経過時間を扱う際に起こり得る問題点とその対処法を理解することは、アプリケーションの品質向上に寄与します。

また、カスタマイズ方法を取り入れることで、自分だけのオリジナルな経過時間表示を実現することも可能です。

Swift言語を使用して、経過時間の表示を効果的に行うための知識と技術を身につけることで、より高度なアプリケーション開発が可能となります。

本記事を通して、Swiftでの経過時間表示の方法をしっかりとマスターし、実際の開発に役立てていただければ幸いです。