和暦→西暦、西暦→和暦に直すやり方です。
コード
import Foundation
import UIKit
extension String {
// ロケーション
static let jaLocale = Locale(identifier: "ja-jp")
/// 和暦の日付文字列を西暦の日付文字列に変換する
///
/// - Returns: 西暦の日付文字列
func convertWarekiToGregorian() -> String? {
let jaLocale = String.jaLocale
let jaCalender = Calendar(identifier: .japanese)
let formatter = DateFormatter()
formatter.calendar = jaCalender
formatter.locale = jaLocale
let form = DateFormatter.dateFormat(fromTemplate: "GyM", options: 0, locale: jaLocale)
formatter.dateFormat = form
guard let date = formatter.date(from: self) else {
return nil
}
return date.toString(dateFormat: "yyyy年M月", identifier: .gregorian)
}
/// 西暦の日付文字列を和暦の日付文字列に変換する
///
/// - Returns: 和暦の日付文字列
func convertGregorianToWareki() -> String? {
let jaLocale = String.jaLocale
let greCalender = Calendar(identifier: .gregorian)
let formatter = DateFormatter()
formatter.calendar = greCalender
formatter.locale = jaLocale
formatter.dateFormat = "yyyy年M月"
guard let date = formatter.date(from: self) else {
return nil
}
return date.toString(dateFormat: "Gy年M月", identifier: .japanese)
}
}
extension Date {
/// 指定された文字列に変換する
func toString(dateFormat: String, timezone: TimeZone? = nil, identifier: Calendar.Identifier) -> String? {
let formatter = DateFormatter()
formatter.dateFormat = dateFormat
if let timezone = timezone {
formatter.timeZone = timezone
} else {
formatter.timeZone = TimeZone(abbreviation: "JST")
}
formatter.locale = Locale(identifier: "ja-jp")
formatter.calendar = Calendar(identifier: identifier)
return formatter.string(from: self)
}
}
// 西暦→和暦
let seirekiDay = "1994年12月"
seirekiDay.convertGregorianToWareki() //→ "平成6年12月"
// 和暦→西暦
let warekiDay = "平成6年12月"
warekiDay.convertWarekiToGregorian() //→ "1994年12月"
ロケーションはjapanですが、カレンダーを.japanese、.gregorianに変える形です。
和暦→西暦変換の際にformatter.dateFormat = "GyM"
だとうまくいきませんでしたので注意です。