前提
以下の条件の場合にダイアログを表示したい
・日付ピッカーで選択した日付が、今日と比べて30日以降だった場合
実現したいこと
ピッカーで選択した値のString(例:20220618)をDate型にしたい
発生している問題・エラーメッセージ
Date型には変換できるのですが、
ピッカーで選択した値の1日前の日に変換されてしまいます。(以下は例です)
・ピッカーで選択した値:20220618
・Date型に変換後の値:2022-06-17 15:00:00 +0000
該当のソースコード
dateSelected には「20220618」という文字列が入っています。
swift
let selectedValue = DateUtils.dateFromString(string: dateSelected, format: "yyyyMMdd") print(selectedValue) // 2022-06-17 15:00:00 +0000 let today = Date() let after30Days = Calendar.current.date(byAdding: .day, value: 30, to: today)! print(after30Days) // 2022-07-18 07:45:26 +0000 // 判定のif文 if selectedValue > after30Days { // ダイアログ表示メソッド }
dateFromString メソッド
swift
import Foundation class DateUtils { class func dateFromString(string: String, format: String) -> Date { let formatter: DateFormatter = DateFormatter() formatter.dateFormat = format return formatter.date(from: string)! } }
試したこと①
1日前になってしまっているのではなく、
9時間ズレてしまっているのではないかと思い、
dateFromString メソッドに以下を追加したが何もかわらず、、
swift
formatter.calendar = Calendar(identifier: .gregorian) formatter.locale = Locale(identifier: "ja_JP")
試したこと②
記事を参考に以下を追加してもダメでした。
参考:【Swift4】Date()の9時間のズレを調整【Date】
swift
formatter.timeZone = TimeZone.current formatter.locale = Locale.current
試したこと③
UTCだと9時間ズレてしまうみたいなので、
明示的にロケールとタイムゾーンを指定する。
※多分、試したこと②とやっていることはかわらない
swift
formatter.locale = Locale(identifier: "ja_JP") formatter.timeZone = TimeZone(identifier: "JST")
引き続き自分でも調査いたしますが、
有識者の方の力をお借りできれば幸いです。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
まだ回答がついていません
会員登録して回答してみよう