中年プログラマーの息抜き

カシマルです。 最近、新しい土地へ引っ越しをしたのですが、これを機に何か始めたいなと思ってブログをはじめました。気の向くままに更新していきます。

swift4 DateFormatter->string 日時と文字列の相互変換で9時間ずれる ので ずれないようにする

はじめに

今回はswiftを使った日付操作で気がついたことのメモ。swiftではDate、Locale、TimeZone、DateFormatter、など考慮したその一例です、ある日時に対して、DateFormatterを利用した「Date<-->String」の相互変換をswiftで書いてみます。

TimeZoneを意識せず実装してみる

DateとStringが異る日時

実行日時:2019-01-1 09:00:00
-> 日時:Date()
-> 日時:2019-01-1 00:00:00 (9時間ずれる)
-> Date -->String:e0.string(from: e1)
-> Date -->String:2019-01-1 09:00:00 (正しい日時)
-> String -->Date:e0.date(from: e2)
-> String -->Date:2019-01-1 00:00:00 (9時間ずれる)
let e0 = DateFormatter()
e0.dateFormat = "yyyy-MM-dd HH:mm:ss"
let e1 = Date()
let e2 = e0.string(from: e1)
let e3 = e0.date(from: e2)

TimeZoneを日本時間に固定してみる

実行日時:2019-01-1 09:00:00

DateとStringが同じ日時

-> 日時:Date.current
-> 日時:2019-01-1 09:00:00 (正しい日時)
-> Date -->String:DateFormatter.current("yyyy-MM-dd HH:mm:ss").string(from: d1)
-> Date -->String:2019-01-1 09:00:00 (正しい日時)
-> String -->Date:DateFormatter.current("yyyy-MM-dd HH:mm:ss").date(from: d2)
-> String -->Date:2019-01-1 09:00:00 (正しい日時)
let d1 = Date.current
let d2 = DateFormatter.current("yyyy-MM-dd HH:mm:ss").string(from: d1)
let d3 = DateFormatter.current("yyyy-MM-dd HH:mm:ss").date(from: d2)

extension TimeZone {
    static let gmt = TimeZone(secondsFromGMT: 0)!
    static let jst = TimeZone(identifier: "Asia/Tokyo")!
}

extension Locale {
    static let japan = Locale(identifier: "ja_JP")
}

extension DateFormatter {
    static func current(_ dateFormat: String) -> DateFormatter {
        let df = DateFormatter()
        df.timeZone = TimeZone.gmt
        df.locale = Locale.japan
        df.dateFormat = dateFormat
        return df
    }
}

extension Date {
    static var current: Date = Date(timeIntervalSinceNow: TimeInterval(TimeZone.jst.secondsFromGMT()))
}

まとめ

以前に書いたカレンダーの記事では・・・

ということで??、例えば、0:0:0 や 23:59:59 正しい日時を扱えるように。

【Android】日当-ヒナタ-

週末で審査に出そうと思います・・

ab39