SwiftでDateFormatterを完全制覇!たったの10ステップ

SwiftのDateFormatterの使い方を図解しているイメージSwift
この記事は約16分で読めます。

 

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

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

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

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

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

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

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

はじめに

Swiftの中で日付や時刻を効果的に取り扱うためには、DateFormatterが鍵となるクラスです。

このクラスを利用することで、日付や時刻の文字列の変換、日付のフォーマット、さまざまなロケールやタイムゾーンでの表示など、多岐にわたる操作が可能になります。

この記事では、初心者の方でも簡単にDateFormatterを使いこなせるように、基本的な使い方から応用、注意点までを順を追って説明していきます。

Swiftの日付や時刻の扱いに関して疑問を持っている方や、もっと深く知りたいという方は、ぜひ最後までお読みください。

●DateFormatterとは

DateFormatterは、SwiftのFoundationフレームワークに含まれるクラスの一つで、日付や時刻を扱う際の強力なツールとなっています。

文字列と日付の間の変換を行うことが主な役割であり、アプリケーションのロケールやユーザーの設定に基づいて、日付や時刻を正しくフォーマットすることができます。

例えば、アメリカと日本では、日付の表示形式が異なります。

アメリカでは”month/day/year”の形式で、日本では”year年month月day日”の形式で日付を表示します。

DateFormatterを使用することで、このような国や地域に応じた日付の表示形式を簡単に実現することができます。

○DateFormatterの基本概念

DateFormatterの主要な役割は、Dateオブジェクトと文字列の間の変換を行うことです。

この変換は、特定のフォーマットを基に行われます。

フォーマットは、”yyyy-MM-dd”や”HH:mm:ss”などの文字列で指定され、これに従って日付や時刻の情報が正しく表現されます。

また、DateFormatterには、日付や時刻の表示に関するさまざまな設定を持っています。

例えば、ロケールやタイムゾーン、カレンダーや曜日の表示方法など、多岐にわたる設定をカスタマイズすることが可能です。

●DateFormatterの基本的な使い方

Swiftの日付や時刻を扱うためには、DateFormatterというクラスが非常に役立ちます。

このクラスを使うことで、日付や時刻の文字列のフォーマットや、文字列から日付への変換などが容易になります。

ここでは、その基本的な使い方を2つのサンプルコードを通じて解説していきます。

○サンプルコード1:日付を文字列に変換する

このコードではDateFormatterを使って、Date型の日付データを文字列に変換する方法を表しています。

この例では、現在の日付を取得し、それを指定したフォーマットの文字列に変換しています。

import Foundation

let now = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let dateString = formatter.string(from: now)
print(dateString)

このコードの実行を行うと、現在の日付が「yyyy-MM-dd」のフォーマットで表示されます。

例えば、2023年10月26日の場合、結果として「2023-10-26」という文字列が出力されることになります。

○サンプルコード2:文字列を日付に変換する

逆に、文字列をDate型の日付データに変換する場面もあります。

このコードでは、指定された日付の文字列をDate型に変換する手法を表しています。

import Foundation

let dateString = "2023-10-26"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
if let date = formatter.date(from: dateString) {
    print(date)
} else {
    print("変換に失敗しました。")
}

このコードでは「2023-10-26」という文字列がDate型に変換され、その結果が表示されます。

ただし、指定したフォーマットに合わない文字列を変換しようとすると、変換に失敗することがあるため、その場合は「変換に失敗しました。」というメッセージが表示されます。

●DateFormatterの詳細な使い方

日付と時刻のフォーマットは、アプリケーションの要件やユーザーの好みによって異なる場合が多いです。

SwiftのDateFormatterクラスを使えば、日付と時刻の表示をカスタマイズしたり、文字列として受け取った日付をDate型に変換したりすることができます。

ここでは、DateFormatterを使った日付と時刻の詳細なフォーマット方法を学びます。

○サンプルコード3:特定のフォーマットで日付を表示する

多くの場面で、特定のフォーマットで日付を表示することが求められます。

下記のコードでは、”yyyy/MM/dd HH:mm”の形式で日付と時刻を表示しています。

import Foundation

let now = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
let formattedDate = formatter.string(from: now)
print(formattedDate)

このコードでは、現在の日付と時刻を取得するためにDate()を使用しています。

その後、DateFormatterのインスタンスを生成し、dateFormatプロパティを”yyyy/MM/dd HH:mm”に設定しています。

これにより、指定されたフォーマットで日付を文字列として取得することができます。

最後に、string(from:)メソッドを使用してDateオブジェクトからフォーマットされた日付文字列を取得し、表示しています。

このコードを実行すると、例えば「2023/10/26 14:30」というような形式で現在の日付と時刻が出力されます。

○サンプルコード4:時刻を含む日付の変換

時刻を含む文字列からDateオブジェクトを作成する場合も、DateFormatterを利用できます。

下記のコードでは、”yyyy/MM/dd HH:mm”の形式の文字列をDateオブジェクトに変換する方法を表しています。

import Foundation

let dateString = "2023/10/26 14:30"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm"
if let date = formatter.date(from: dateString) {
    print(date)
} else {
    print("日付の変換に失敗しました。")
}

このコードでは、まず”yyyy/MM/dd HH:mm”の形式で文字列として日付を定義しています。

次に、DateFormatterのインスタンスを生成し、dateFormatプロパティを設定しています。

そして、date(from:)メソッドを使用して、文字列からDateオブジェクトを生成しています。

変換が成功すれば、Dateオブジェクトが出力されます。

変換が失敗すると、エラーメッセージが出力されます。

このコードを実行すると、文字列「2023/10/26 14:30」がDateオブジェクトに変換され、そのDateオブジェクトが出力されます。

ただし、変換に失敗した場合、”日付の変換に失敗しました。”というメッセージが表示されます。

●DateFormatterの応用例

SwiftのDateFormatterは、基本的な使い方だけでなく、さまざまな応用例を持っています。

日付の計算や表示、異なるロケールでの日付の表示、カスタムフォーマットの作成など、幅広い用途で活用できます。

○サンプルコード5:日付の計算と表示

日付の計算は、SwiftのDateとCalendarクラスを組み合わせて行います。

下記のコードでは、現在の日付から2日後の日付を計算し、それを文字列として表示しています。

import Foundation

let now = Date()
let calendar = Calendar.current
if let twoDaysAfter = calendar.date(byAdding: .day, value: 2, to: now) {
    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    let dateString = formatter.string(from: twoDaysAfter)
    print(dateString)
}

このコードでは、Calendarクラスのdate(byAdding:value:to:)メソッドを使って、現在の日付から2日後の日付を計算しています。

その後、DateFormatterを使って日付を文字列に変換し、結果を表示しています。

このコードを実行すると、例えば「2023年10月28日」といったような形式で、2日後の日付が表示されます。

○サンプルコード6:異なるロケールでの日付表示

DateFormatterは、ロケールごとの日付表示もサポートしています。

下記のコードは、日本語と英語での日付表示の違いを表しています。

import Foundation

let date = Date()
let formatter = DateFormatter()
formatter.dateStyle = .long

// 日本語での日付表示
formatter.locale = Locale(identifier: "ja_JP")
print(formatter.string(from: date))

// 英語での日付表示
formatter.locale = Locale(identifier: "en_US")
print(formatter.string(from: date))

このコードでは、DateFormatterのlocaleプロパティを使って、日付の表示言語を変更しています。

まず、日本語のロケールをセットし、日付を表示。

次に、英語のロケールをセットし、同じ日付を英語で表示します。

例えば、2023年10月26日の場合、日本語では「2023年10月26日」と表示され、英語では「October 26, 2023」と表示されます。

○サンプルコード7:カスタムフォーマットを作成する

DateFormatterでは、好みの日付や時刻のフォーマットを自由に作成することができます。

下記のコードは、カスタムの日付フォーマットを使って日付を表示する例です。

import Foundation

let date = Date()
let formatter = DateFormatter()

// カスタムフォーマットの設定
formatter.dateFormat = "yyyy年MM月dd日(E) HH:mm:ss"
let customDateString = formatter.string(from: date)
print(customDateString)

このコードでは、DateFormatterのdateFormatプロパティを使用して、独自の日付フォーマットを設定しています。

この例では「年、月、日、曜日、時、分、秒」を表示するカスタムフォーマットを設定しています。

このコードを実行すると、「2023年10月26日(木) 14:30:45」といった形式で日付と時刻が表示されます。

●注意点と対処法

日付や時刻を取り扱う際、SwiftのDateFormatterは非常に便利なツールとして使われます。

しかし、その使い方には注意点も存在します。

特に、タイムゾーンの問題やロケールの違いは、予期せぬ結果を生むことがあるため、正しく理解し、適切な対処をすることが必要です。

○タイムゾーンの問題と対処法

日付や時刻を扱うとき、タイムゾーンは重要な要素となります。

世界各地での時差が存在するため、特定の地域での正確な時刻を知りたい場合や、複数の地域を対象とするアプリケーションを開発する際には、タイムゾーンの取り扱いに注意が必要です。

この問題を解決するためのサンプルコードを紹介します。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm"
dateFormatter.timeZone = TimeZone(abbreviation: "JST") // 日本時間に設定

let dateInJapan = dateFormatter.date(from: "2023/10/26 12:00")
print(dateInJapan)

このコードではDateFormatterを使って、日本時間で2023年10月26日12時を表す日付オブジェクトを作成しています。

TimeZone(abbreviation: "JST")を設定することで、日本時間での日付変換が行われます。

この例を参考に、タイムゾーンを考慮して日付変換を行うことができます。

このサンプルコードの結果として、日本時間での2023/10/26 12:00の日付オブジェクトが出力されます。

○ロケールの違いと対処法

ロケールは、言語や地域、カルチャーに基づいた情報の集まりを指します。

DateFormatterを使用する際、ロケールの設定によっては日付の表示形式が変わることがあります。

例えば、英語のロケールと日本語のロケールでは、月の表示名が異なります。

このようなロケールの違いを適切に扱うためのサンプルコードを以下に示します。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM d, yyyy"
dateFormatter.locale = Locale(identifier: "en_US") // 英語のロケールに設定

let dateInEnglish = dateFormatter.string(from: Date())
print(dateInEnglish)

このコードでは、現在の日付を英語の月の名前で表示するための変換を行っています。

Locale(identifier: "en_US")を設定することで、英語のロケールに基づいた日付表示が可能となります。

この例を参考に、異なるロケールでの日付表示を適切に行うことができます。

このサンプルコードの結果として、現在の日付が英語の月の名前で正確に出力されます。

●カスタマイズ方法

SwiftのDateFormatterは非常に強力で、多くのカスタマイズが可能です。

ここでは、そのカスタマイズ方法に焦点を当て、日付や時刻をさらに効果的に扱えるようになるテクニックを紹介します。

○サンプルコード8:DateFormatterのプロパティを利用したカスタマイズ

このコードでは、DateFormatterのプロパティを使って日付の表示をカスタマイズする方法を表しています。

この例では、曜日を3文字で表示し、月をフルネームで表示するカスタマイズを行っています。

import Foundation

let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "EEE, MMMM d, yyyy"
let result = formatter.string(from: date)
print(result)

このコードを実行すると、例えば「Wed, October 25, 2023」といった形式で現在の日付が表示されます。

ここで、dateFormatプロパティを設定することにより、希望するフォーマットに合わせた日付の文字列を取得することができます。

○サンプルコード9:自分だけのフォーマットを作る

DateFormatterでは、標準的なフォーマットだけでなく、自分だけのオリジナルなフォーマットを作成することも可能です。

このコードでは、オリジナルのフォーマットを作成して日付を表示しています。

この例では、日、月、年を”/”で区切り、時、分、秒を”:”で区切って表示するフォーマットを作成しています。

import Foundation

let customDate = Date()
let customFormatter = DateFormatter()
customFormatter.dateFormat = "dd/MM/yyyy HH:mm:ss"
let customResult = customFormatter.string(from: customDate)
print(customResult)

このコードを実行すると、「25/10/2023 12:34:56」のような形式で現在の日付と時刻が表示されます。

dateFormatプロパティを利用することで、独自の日付・時刻の表示スタイルを作成することができ、アプリケーションに合わせた表示が可能となります。

●DateFormatterの豆知識

SwiftのDateFormatterを使用する際に、知っておくと役立つ情報をいくつか取り上げます。

この知識を身につけることで、DateFormatterの使用がさらにスムーズになります。

○DateとTimeの違い

Swiftでは、日付や時刻を取り扱うためのDateというクラスが提供されています。

しかし、一般的な認識として、「日付」と「時刻」は異なる概念として捉えられることが多いです。

このコードでは、Dateオブジェクトを作成し、その内容を表示しています。

この例では、現在の日付と時刻を取得して表示しています。

// Dateオブジェクトの生成
let currentDate = Date()

// Dateオブジェクトの内容を表示
print(currentDate)

このコードを実行すると、2023年10月26日 12:00:00 などのように、現在の日付と時刻が表示されます。

この結果からわかる通り、Dateは日付と時刻の両方を表現しています。

○SwiftのDate関連のクラスとその特徴

Swiftには日付や時刻を扱うためのさまざまなクラスや構造体が存在します。主なものとしては、Date, DateComponents, Calendarなどがあります。

□Date

Swiftでの瞬間的な時点を表します。

Unixエポックからの経過秒数として内部的に表現されています。

□DateComponents

日、月、年などの日付や時刻の要素を個別に扱いたい場合に使用します。

例えば、ある日付の月や年を取得する場合などに使用します。

このコードでは、DateComponentsを使って2023年10月26日の年、月、日を取得しています。

この例では、指定した日付の年、月、日を取得して表示しています。

// Calendarオブジェクトの生成
let calendar = Calendar.current

// DateComponentsの取得
let dateComponents = calendar.dateComponents([.year, .month, .day], from: Date())

// 年、月、日を表示
print("年: \(dateComponents.year!)")
print("月: \(dateComponents.month!)")
print("日: \(dateComponents.day!)")

このコードを実行すると、「年: 2023」「月: 10」「日: 26」といった形で指定した日付の年、月、日が表示されます。

□Calendar

日付の計算や、特定のカレンダーシステムに基づいて日付を操作する際に使用します。

例えば、グレゴリオ暦や日本暦などの異なるカレンダーシステムを利用する場合に有用です。

まとめ

SwiftのDateFormatterは、日付や時刻を効果的に扱うための強力なツールです。

本記事で紹介したステップやサンプルコードを通じて、その基本的な使い方から応用的な活用方法までを学ぶことができたかと思います。

特に、日付と時刻の違いや、SwiftでのDate関連のクラスとその特性についての理解は、日付や時刻を扱うアプリケーションの開発において非常に役立つ知識となるでしょう。

また、DateFormatterの細かい設定やカスタマイズ方法、さらには留意すべき注意点も詳細に解説しました。

これにより、日付のフォーマットや時刻の表示を柔軟にカスタマイズすることが可能となります。

Swiftにおける日付や時刻の取り扱いは多岐にわたるため、今回紹介した内容を基盤にしてさらなる深い学びを重ねていくことをおすすめします。

日付や時刻を扱うアプリケーションの品質やユーザビリティの向上のために、これらの知識を活かしてください。