日付と時間の書式を定義するクラスです。
Date構造体←→テキストの相互変換に使います。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.2
【iOS】13.4.1
【macOS】Catalina バージョン 10.15.4
Date→テキスト変換
Date→テキスト変換のサンプルソース示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/// DateFomatterクラスのインスタンス生成 let dateFormatter = DateFormatter() /// カレンダー、ロケール、タイムゾーンの設定(未指定時は端末の設定が採用される) dateFormatter.calendar = Calendar(identifier: .gregorian) dateFormatter.locale = Locale(identifier: "ja_JP") dateFormatter.timeZone = TimeZone(identifier: "Asia/Tokyo") /// 変換フォーマット定義(未設定の場合は自動フォーマットが採用される) dateFormatter.dateFormat = "yyyy年M月d日(EEEEE) H時m分s秒" /// データ変換(Date→テキスト) let dateString = dateFormatter.string(from: Date()) print(dateString) // "2020年4月25日(土) 16時8分56秒" |
dateFormatプロパティで変換フォーマットを定義し、stringメソッドでDate→テキスト変換を行います。
変換フォーマット定義で使える書式一覧
Date←→テキスト変換の変換フォーマット定義で使える書式一覧です。
変換例は、適用されるカレンダーおよびロケールによって変わります。
年
書式 | 例 | 説明 |
---|---|---|
y | 1, 12, 1234, 12345 | 最小桁数で出力 |
yy | 01, 12, 34, 45 | 下2桁固定出力、0パディング有り |
yyyy | 0001, 0012, 1234, 12345 | 最小桁数4桁で出力、0パディング有り |
カレンダーにjapanese(和暦)を採用した場合のみ、書式文字の後ろに”年”を付けると必ず最小桁数出力になるようです。
月
書式 | 例 | 説明 |
---|---|---|
M | 4, 12 | 数値、最小桁数 |
MM | 04, 12 | 数値、2桁固定、0パディング有り |
MMM | Apr, Dec, 12月 | 文字列(短縮形) |
MMMM | April, December, 12月 | 文字列(完全) |
MMMMM | A, D, 12 | 文字列(記号) |
日
書式 | 例 | 説明 |
---|---|---|
d | 1, 12 | 最小桁数 |
dd | 01, 12 | 2桁固定、0パディング有り |
時(12時間表記)
書式 | 例 | 説明 |
---|---|---|
h | 1, 12 | 最小桁数 |
hh | 01, 12 | 2桁固定、0パディング有り |
時(24時間表記)
書式 | 例 | 説明 |
---|---|---|
H | 1, 13 | 最小桁数 |
HH | 01, 13 | 2桁固定、0パディング有り |
アプリ側でLocaleを明示的に指定しない場合は、端末のロケールと24時間表示設定が変換結果に影響します。
このケースで端末側の24時間設定がoffになっていると、出力結果が”午前1時”、"午後1時”になるので注意して下さい。
端末の設定内容は「設定」>「一般」>「日付と時刻」で確認できます。
分
書式 | 例 | 説明 |
---|---|---|
m | 1, 12 | 最小桁数 |
mm | 01, 12 | 2桁固定、0パディング有り |
秒
書式 | 例 | 説明 |
---|---|---|
s | 1, 12 | 最小桁数 |
ss | 01, 12 | 2桁固定、0パディング有り |
ミリ秒
書式 | 例 | 説明 |
---|---|---|
S | 1 | 1桁固定 |
SS | 01, 12 | 2桁固定 |
SSS | 010, 12, 012 | 3桁固定 |
元号
書式 | 例 | 説明 |
---|---|---|
G | AD, 西暦, 令和 | 暦法およびロケールに応じた元号(省略形) |
GGGG | Anno Domini, 西暦, 令和 | (完全) |
GGGGG | A, AD, R | (記号) |
曜日
書式 | 例 | 説明 |
---|---|---|
E | Sat, 土 | 暦法およびロケールに応じた曜日(省略形) |
EEEE | Saturday, 土曜日 | (完全) |
EEEEE | S, 土 | (記号) |
午前、午後
書式 | 例 | 説明 |
---|---|---|
a | PM,午後 | ロケールに応じた午前/午後表記 |
aaaaa | p,午後 | (記号) |
Date→テキスト変換(自動フォーマット)
変換フォーマットを指定せずに変換をする場合は、自動フォーマットとなります。
自動フォーマットでは、次の2つのプロパティ値を元に、カレンダー、ロケール、ユーザーの環境、OSのバージョン等に応じて、フォーマットが決定されます。
DateFormatter.dateStyle
日付の自動フォーマットスタイルの指定、デフォルト値はnone
DateFormatter.timeStyle
時間の自動フォーマットスタイルの指定、デフォルト値はnone
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/// DateFomatterクラスのインスタンス生成 let dateFormatter = DateFormatter() /// カレンダー、ロケール、タイムゾーンの設定(未指定時は端末の設定が採用される) dateFormatter.calendar = Calendar(identifier: .gregorian) dateFormatter.locale = Locale(identifier: "ja_JP") dateFormatter.timeZone = TimeZone(identifier: "Asia/Tokyo") /// 変換フォーマット定義(未設定の場合は自動フォーマットが採用される) //dateFormatter.dateFormat = "yyyy年M月d日(EEEEE) H時m分s秒" /// 自動フォーマットのスタイル指定 dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long /// データ変換(Date→テキスト) let dateString = dateFormatter.string(from: Date()) print(dateString) // "2020年4月26日 8:57:52 JST" |
スタイル別の出力結果サンプル
dateStyle
スタイル値 | gregorian、en_US | gregorian、ja_JP | japanese、ja_JP |
---|---|---|---|
.none | 出力無し | 出力無し | 出力無し |
.short | 4/24/20 | 2020/04/24 | R2/04/24 |
.medium | Apr 24, 2020 | 2020/04/24 | R2/04/24 |
.long | April 24, 2020 | 2020年4月24日 | 令和2年4月24日 |
.full | Friday, April 24, 2020 | 2020年4月24日 金曜日 | 令和2年4月24日 金曜日 |
timeStyle
スタイル値 | gregorian、en_US | gregorian、ja_JP | japanese、ja_JP |
---|---|---|---|
.none | 出力無し | 出力無し | 出力無し |
.short | 2:23 PM | 14:23 | 14:23 |
.medium | 2:23:56 PM | 14:23:56 | 14:23:56 |
.long | 2:23:56 PM GMT+9 | 14:23:56 JST | 14:23:56 JST |
.full | 2:23:56 PM Japan Standard Time | 14時23分56秒 日本標準時 | 14時23分56秒 日本標準時 |
テキスト→Date変換
テキスト→Date変換では変換処理がstring()の代わりにdate()に置き換わります。
1 2 3 |
DateFormatter.date(from: String) -> Date |
その他の使い方はDate→テキスト変換時と全く同様です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/// DateFomatterクラスのインスタンス生成 let dateFormatter = DateFormatter() /// カレンダー、ロケール、タイムゾーンの設定(未指定時は端末の設定が採用される) dateFormatter.calendar = Calendar(identifier: .gregorian) dateFormatter.locale = Locale(identifier: "ja_JP") dateFormatter.timeZone = TimeZone(identifier: "Asia/Tokyo") /// 変換フォーマット定義(未設定の場合は自動フォーマットが採用される) dateFormatter.dateFormat = "yyyy年M月d日(EEEEE) H時m分s秒" /// データ変換(Date→テキスト) //let dateString = dateFormatter.string(from: Date()) //print(dateString) // "2020年4月25日(土) 16時8分56秒” /// データ変換(テキスト→Date) let date = dateFormatter.date(from: "2020年4月25日(土) 16時8分56秒") print(date!) // 2020-04-25 07:08:56 +0000 |
ISO8601形式の変換
ISO8601は時刻フォーマットに関する国際標準のフォーマットで、APIやログ出力などで一般的に使用されています。
このISO8601形式のDate←→テキスト相互変換には、専用クラス(ISO8601DateFormatter)が用意されていますので、こちらを使うと良いでしょう。
ISO8601形式に最適化されていますので、プロパティの設定を考えずに使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/// インスタンス生成 let formatter = ISO8601DateFormatter() /// TimeZoneの設定(未設定の場合はGMTが採用される) //formatter.timeZone = TimeZone(identifier: "Asia/Tokyo") /// Date→文字列変換 let strDate = formatter.string(from: Date()) print(strDate) // 2020-04-25T06:00:39Z /// 文字列→Date変換 let date = formatter.date(from: strDate) print(date!) // 2020-04-25 06:00:39 +0000 |