暦が和暦かどうかを判定
NSCalendar
extension Calendar {
func isJapaneseCalendar() -> Bool {
return self.identifier == Calendar.Identifier.japanese
}
}
元号を得る
カレンダーを japanese
, フォーマットに G
を用いると、平成時代なら「平成」「Heisei」が得られる。
let f = DateFormatter()
f.locale = Locale.current
f.calendar = Calendar(identifier: .japanese)
f.dateFormat = "G" // 平成, Heisei
y
を用いて和暦の年数を得る。和暦表記では零埋めをしないだろうから、通常は Gy
で十分かもしれない。
let f = DateFormatter()
f.locale = Locale.current
f.calendar = Calendar(identifier: .japanese)
f.dateFormat = "Gy" // 平成2, Heisei2
f.dateFormat = "Gyy" // 平成02, Heisei02
上記だとOS設定言語に依存するので、例えば英語環境だと Heisei
という具合になる。常に日本語にするなら Locale を固定する。
f.locale = Locale(identifier: "ja")
おまけ:「西暦」「AD」を得る
let f = DateFormatter()
f.calendar = Calendar(identifier: .gregorian)
f.dateFormat = "Gy" // 西暦2017, AD2017
和暦の日付表記を得る
let f = DateFormatter()
f.locale = Locale(identifier: "ja")
f.calendar = Calendar(identifier: .japanese)
f.dateFormat = "Gy年M月d日"
let dateStr = f.string(from: date) // "平成29年3月22日"
OSの暦設定・言語設定に合わせる(手っ取り早い方法)
let f = DateFormatter()
f.locale = Locale.current
f.dateStyle = .medium
f.timeStyle = .none
let dateStr = f.string(from: date) // "H29/03/22" "2017/03/22"
OSの設定に依存せず常に西暦表記・24時間表記にする
暦が和暦の環境で 0029/3/22
といった具合になってしまう、日付バグあるあるを防止する方法。Locale を en_US_POSIX
固定にすれば良い。
普段使っている iPhone の暦設定を和暦にしていると、和暦(というか国際化)にきちんと対応しているアプリ、対応が甘いアプリが一目瞭然で面白いのでオススメ。
let f = DateFormatter()
f.locale = Locale(identifier: "en_US_POSIX")
f.dateFormat = "yyyy.MM.dd HH:mm:ss"
let dateStr = f.string(from: date) // "2017.03.22 23:59:59"