■ 日付時刻をフォーマットして表示する
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("日付に変換できません") }