LoginSignup
2
3

More than 5 years have passed since last update.

【swift】和暦→西暦、西暦→和暦に変換するStringのExtensionの書き方

Last updated at Posted at 2018-03-13

和暦→西暦、西暦→和暦に直すやり方です。

コード


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"だとうまくいきませんでしたので注意です。

2
3
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
2
3