Swift 日付T時刻フォーマット処理 ISO8601

ISO8601DateFormatterを使った方法

WebAPIなどのJSON文字列で”yyyy-MM-ddTHH:mm:ss+0900″のような形式をDateTimeとして扱う場合があります。このフォーマットはISO-8601で定められた国際規格とのことです。Swiftは、ISO-8601の国際規格フォーマットの文字列をDate型に変換するためのISO8601DateFormatterというクラスが用意されています。下記のコードは、ISO-8601形式の文字列からDateに変換する例です。

import Foundation

let s1: String = "2020/10/08T13:08:00+0900"
let fmt: ISO8601DateFormatter = ISO8601DateFormatter()
let d1:Date = fmt.date(from: s1)!

上記コードの結果は「2020-10-08T04:08:00Z」になりました。9時間のズレがありますがこれは協定世界時(UTC)です。ISO8601DateFormatterは、Formatterを継承して作成されています。それに加えISO8601DateFormatterの内部には、timeZoneを設定できます。timeZoneを設定することで、日本時間表示が可能になります。

import Foundation

let s1: String = "2020/10/08T13:08:00+0900"
let fmt: ISO8601DateFormatter = ISO8601DateFormatter()
fmt.timeZone = TimeZone(identifier: "Asia/Tokyo")!
let d1:Date = fmt.date(from: s1)!

timeZoneTimeZone(identifier: “Asia/Tokyo”)日本時間を設定しています。このtimeZoneを設定することでprintなどでアウトプットさせる場合も日本時間として表示されます。

Date型をISO-8601文字列に変換するには下記のような記述ができます。

let fmt: ISO8601DateFormatter = ISO8601DateFormatter()
fmt.timeZone = TimeZone(identifier: "Asia/Tokyo")!
print( fmt.string(from: Date()) )

SwiftUI JSONキーにハイフン(-)が付いている場合の対処 hyphen

hyphen json JSONEncoder

前回、SwiftJSONDecoderを使った処理方法を書きました。今回JSONキーにハイフンが混ざった処理をご紹介します。ハイフン(hyphen)が入った変数を作成することができません。ビルドエラーになってしまいます。しかしWeb上のAPIにはハイフンが混ざったキーもよく見かけます。例えば下記のようなJSONです。

{ "name-1": "Lenina Crowne" }

この場合”name1“なので下記のようにしたいのですがこれではビルドできません。

ビルドエラー
ビルドエラー

JSONキーにハイフンが含まれる場合CodingKeyが含まれたenum宣言を構造体に埋めてキー名の変換を行います。

struct TJson : Codable {
    var name1: String
    enum CodingKeys : String, CodingKey {
        case name1 = "name-1"
    }
}

enumの名称は「CodingKeys」とする必要があるようです。他の名前ではビルドは成功するものの実行するとエラーになりました。

struct TCodingKeyJSONView: View {
    @State var json1 = """
        { "name-1": "Lenina Crowne" }
    """
    var body: some View {
        Text(jsonConvert(json1).name1)
    }
    func jsonConvert(_ s1: String) -> TJson {
        do {
            return try JSONDecoder().decode(TJson.self, from: s1.data(using: .utf8)! )
        } catch {
            return TJson(name1: "")
        }
    }
}

ハイフンキーが入ったJSONの処理ができました。
ハイフンキーが入ったJSONの処理ができました。

JSONEncoderを使ってTJsonからJSON文字列に変換も試してみました。

struct TCodingKeyJSONView: View {
    var body: some View {
        Text(tJsonToJsonStr(TJson(name1: "Bernard Marx")))
    }
    func tJsonToJsonStr(_ j: TJson) -> String{
        let enc = JSONEncoder()
        do {
            let d1 = try enc.encode(j)
            return String(data: d1, encoding: .utf8)!
        } catch {
            return "{}"
        }
    }
}

JSONEncoderもうまく動きました。

ハイフンキー付きJSON作成する場合のJSONEncoder
ハイフンキー付きJSON作成する場合のJSONEncoder
2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED