LoginSignup
36
29

More than 5 years have passed since last update.

和暦に関するメモ

Last updated at Posted at 2017-03-22

暦が和暦かどうかを判定

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"
36
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
29