和暦に関するメモ

  • 10
    Like
  • 0
    Comment

暦が和暦かどうかを判定

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"