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 正しい日時を扱えるように。
週末で審査に出そうと思います・・
ab39