DateFormatterを汎用化する

9月は山登りしたりテント泊したり、遅めの夏休みということで海外旅行🏝したり、リフレッシュできて満足しているmuchanです。
仕事とプライベートで割と慌ただしくしていた分、体調が心配だったけれども、毎日DHCのマルチビタミンを飲んでうがい手洗いをしていたら、風邪引くこともなく全力投球できました。やっぱり予防は大事ですね💁‍♀️

今回は割と自分のメモに近いですが、DateFormatterを汎用化する話。
DateをStringへ変換する際等によく利用するDateFormatterですが、DateFormatterを生成が重いという話をよく聞きますよね。計測している記事が参考になります👀

日時をDateの形で持っておいて、View側で日時を文字列に変換したい場合などには、ViewController側でDateFormatterを保持したりしますが、割と同じ形式の文字列に変換する事が多かったので、シングルトンで保持してどこからでも利用できるようにしました。

こんな感じ。

class MyDateFormatter {
    static let shared = MyDateFormatter()
    private let yyyyMMddDateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        dateFormatter.dateFormat = "yyyy/MM/dd"
        return dateFormatter
    }()

    private let HHmmDateFormatter: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        dateFormatter.dateFormat = "HH:mm"
        return dateFormatter
    }()

    func formatToyyyyMMdd(from date: Date) -> String {
        return yyyyMMddDateFormatter.string(from: date)
    }

    func formatToHHmm(from date: Date) -> String {
        return HHmmDateFormatter.string(from: date)
    }
}

利用する際は、以下のようになります。

let dateString = MyDateFormatter.shared.formatToyyyyMMdd(from: date)

よく使う形式のDateFormatterについては、シングルトンにして各処理から呼び出すようにする事で生成を1度で済ませることができ、処理を効率化できますね🙌