■ 日付時刻をフォーマットして表示する

DateFormatteクラスを使用して、Dateオブジェクトをロケールに応じていろいろなフォーマットして表示する方法について説明しましょう。
DateFormatterクラスでは日付のスタイルはdateStyleプロパティ設定します。

プロパティ:dateStyle
説明;日付のスタイルを設定する

時間のスタイルをtimeStyleプロパティで設定します。

プロパティ:timeStyle
説明;時間のスタイルを設定する

どちらも「.long」「.medium」、「.short」、「.none」などの値がとれます。

ロケールを設定するにはlocaleプロパティを使用します

プロパティ:locale
説明;ロケールを設定する

引数で指定したDateオブジェクトから、設定したスタイルの日付時刻の文字列を戻すにはstring(from:)メソッドを使用します。

メソッド:string(from:)
宣言:sfunc string(from date: Date) -> String
説明:Dateoオブジェクト管理する日付時刻を指定したフォーマットの文字列で戻す

次に、現在の日付時刻を、日付と時刻のどちらもスタイルに「.long」を設定し日本語圏のロケールで表示する例を示します。

let now = Date()

// 日本語兼用の日付時刻のフォーマッタを設定
var formatter = DateFormatter()
let jaLocale = Locale(identifier: "ja_JP")
formatter.locale = jaLocale
formatter.dateStyle = .long
formatter.timeStyle = .long

// フォーマットで指定した形式で日付時刻を表示
print(formatter.string(from:now)) // 2016年9月13日 23:02:08 JST

フランス用ロケール「”fr_FR”」で表示するには次のようにします。

let now = Date()

// フランス用の日付時刻のフォーマッタを設定
var formatter = DateFormatter()
let jaLocale = Locale(identifier: "fr_FR")
formatter.locale = jaLocale
formatter.dateStyle = .long
formatter.timeStyle = .long

// フォーマットで指定した形式で日付時刻を表示
print(formatter.string(from:now)) // 13 septembre 2016 à 23:12:22 UTC+9

■ 日付時刻を表す文字列からDateオブジェクトを生成する

続いて日付時刻を表す文字列からDateオブジェクトを生成する方法について説明しましょう。それにはDateFormatterクラスのdate(from:)メソッドを使用します。

メソッド:date(from:)
宣言:func date(from string: String) -> Date?
説明:日付を表す文字列からNSDateオブジェクトを生成する

たとえば、ロケールを日本語圏に設定し、timeStyleプロパティとdateStyleプロパティをともに「.short」に設定した場合には、引数に次のような形式で日付時刻を表す文字列を指定します。

2017/09/02 00:59
↑ ↑ ↑ ↑ ↑ ↑
西暦年4桁 月2桁 日1桁 時間2桁 分2桁
*dateFromString()メソッドの戻り値はオプショナル型になります。日付時刻に変換できない場合にはnilが戻されます。
次に「”2017/09/02 00:50″」といった形式の文字列からDateオブジェクトを生成する例を示します。

var formatter = DateFormatter()
let jaLocale = Locale(identifier: "ja_JP")
formatter.locale = jaLocale
formatter.dateStyle = .short
formatter.timeStyle = .short

// Dateオブジェクトを生成
let theDate = formatter.date(from: "2017/09/02 00:50")!

// フォーマットで指定した形式で日付時刻を表示
formatter.dateStyle = .long
formatter.timeStyle = .long
print(formatter.string(from:theDate)) // 2017年9月2日 0:50:00 JST

*ISO8601DateFormatteも利用可能

■ 日付時刻の表示形式を独自に設定する

DateFormatterクラスのdataFormatプロパティを使用すると、「.long」や「.short」といった既定のスタイルだけでなく、オリジナルの日付時刻のスタイルを設定可能です。

プロパティ: dateFormat
説明: 日付時刻のフォーマットを設定する

フォーマットは日時を表す文字列で設定します。たとえば年は「y」で指定し「yyyy」だと4桁表示になります。また、「M」(月)、「d」(日)、「E」(曜日)、「H」(24時間形式の時間)、「m」(分)などが利用可能です(http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns)
次に日付時刻を「2017年09月22日(水) 13時11分」のような形式で表示するためのフォーマットの作成例を示します。

var formatter = DateFormatter()
let jaLocale = Locale(identifier: "ja_JP")
formatter.locale = jaLocale
formatter.dateFormat = "yyyy年MM月dd日(EEE) HH時mm分"

var now = Date()
print(formatter.string(from:now))

■ 日時を表す文字列を読み込むためスタイルを指定する

DateFormatterクラスのdataFormatプロパティは、出力だけでなく、日付を表す文字列を読み込む際のスタイル指定にも使用できます。
ここでは、「”yyyy年MM月dd日 HH時mm分”」といった形式の日付を変換するオリジナルのフォーマットを用意し、その書式にしたがった日付時刻の文字列からDateクラスのインスタンスを生成してみましょう。

var formatter = DateFormatter()
let jaLocale = Locale(identifier: "ja_JP")
formatter.locale = jaLocale
formatter.dateFormat = "yyyy年MM月dd日 HH時mm分"

if let theDate = formatter.date(from: "2016年09月15日 20時45分") {
print(theDate.description(with: jaLocale)) // 2016年9月15日木曜日 20時45分00秒 日本標準時
} else {
print("日付に変換できません")
}