この記事では【SwiftUI】DateとStringの型変換(キャスト)の方法について解説します。
iOSのアプリ開発で日時を扱う動作を行う際、DatePickerを利用する機会が多いと思います。
DatePickerはBindingのDate型の値を選択している値として利用しているため、その後選択した値をString型として扱う際は、型変換を行う必要があります。
また、APIを利用する際は、バックエンド側が扱う日時に型に合わせて、値のやり取りを行う必要があるので、Date⇔String間での変換、さらにYYYY-MM-DDなどフォーマットの調整も必要となります。
今回は、API接続での実際の開発でよく利用される方法をメインに、DateとStringの型変換(キャスト)の方法の紹介します。
◆動作検証環境
・XCode:12.1
・SwiftUI:2.0
Date型からString型への型変換(キャスト)
バックエンド側の日時YYYY-MM-DD に対応するように、Date型をフォーマットを指定してString型に変換する方法です。
Calendarクラスを利用する方法
1 2 3 4 5 6 7 8 9 10 | var date = Date() print(date) let calendar = Calendar(identifier: .gregorian) let dateComponents = calendar.dateComponents([.year, .month, .day], from: date) let select_date:String = "\(dateComponents.year!)-\(dateComponents.month!)-\(dateComponents.day!)" print(select_date) |
1 2 3 4 5 | 2020-11-04 11:53:15.982993+0700 2020-11-4 |
DateFormatterクラスを利用する方法
1 2 3 4 5 6 7 8 9 10 11 | var date = Date() print(date) let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "ja_JP") dateFormatter.dateStyle = .medium dateFormatter.dateFormat = "yyyy-MM-dd" print(dateFormatter.string(from: date)) |
1 2 3 4 5 | 2020-11-04 11:53:15.982993+0700 2020-11-04 |
String型からDate型への型変換(キャスト)
バックエンドから値を取得し、DatePickerなどDate型として利用する際に利用する方法です。
1 2 3 4 5 6 7 8 | func StringToDate(dateValue: String, format: String) -> Date { let dateFormatter = DateFormatter() dateFormatter.calendar = Calendar(identifier: .gregorian) dateFormatter.dateFormat = format return dateFormatter.date(from: dateValue) ?? Date() } |
例えば、Django-REST-Frameworkから、YYYY-MM-DD のフォーマットのString型をDate型に変換する場合です。
1 2 3 4 5 | var dataFromAPI:String start_date: StringToDate(dateValue: dataFromAPI, format: "yyyy/MM/dd") |
*format: "yyyy/MM/dd" の部分は受け取る値のフォーマットによって変更する必要があります。
日時と時刻を含む場合は、yyyy/MM/dd HH:mm:ss などです。
String型からString型へのフォーマット変換
状況によってはString型で管理された日付の値を、違うString型のフォーマットにして扱いたい場合もあると思います。
他にも方法はあると思いますが、ここでは、String→Date→String型と型変換しながら、フォーマットも変える方法を紹介します。
例えば下記のStringの値があった場合を例として解説を行います。
1 2 3 | let sampleDate:String = "2020-10-28T17:52:24.154547+09:00" |
String→Date→String型と型変換しながら、フォーマットも変えるメソッドを下記のように作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | func stringToStringDate(stringDate: String, format:String) -> String { let dateFormatter = DateFormatter() dateFormatter.calendar = Calendar(identifier: .gregorian) dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ" //変換元のStringのDateの型に合わせる必要あり let newDate = dateFormatter.date(from: stringDate)! dateFormatter.dateFormat = format dateFormatter.locale = Locale(identifier: "ja_JP") //日本のタイムゾーン設定をする let getDate = dateFormatter.string(from: newDate) return getDate } |
1 2 3 4 | stringToStringDate(stringDate: sampleDate,format:"yyyy年MM月dd日")) // 2020年10月28日 |
iOS14からのTextでのDate型の表示
iOS14からText() でDate 型を表示する際に、styleを指定する事でString 型に変換しなくても表示できるようになりました。
1 2 3 4 5 6 7 | Text(Date(),style: .date) //2021年2月3日 Text(Date(),style: .time) //午後1:58 |
以上、SwiftUIでの、DateとStringの型変換(キャスト)の方法、iOS14からのTextでのDate型の表示について解説しました。