Skip to content

Instantly share code, notes, and snippets.

@eienf
Created May 6, 2021 13:40
Show Gist options
  • Select an option

  • Save eienf/fdd2d190968c75d92249c1b9901c0472 to your computer and use it in GitHub Desktop.

Select an option

Save eienf/fdd2d190968c75d92249c1b9901c0472 to your computer and use it in GitHub Desktop.

Revisions

  1. eienf created this gist May 6, 2021.
    129 changes: 129 additions & 0 deletions jera.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,129 @@
    import Foundation

    let japanease = Calendar(identifier: .japanese)
    let gregorian = Calendar(identifier: .gregorian)

    let locale = Locale(identifier: "ja")
    let format = DateFormatter()
    format.calendar = japanease
    format.dateFormat = "Gy年"
    format.locale = locale

    ///////////////////////////////////////////////
    // swiftc -o jera jera.swift
    // ./jera (2001 -length 10)
    // ./jera startYear (-length 10)
    // ./jera startYear stopYear
    // print first year of the era include specified year
    ///////////////////////////////////////////////

    func era(year:Int) -> Int? {
    let comp = DateComponents(calendar: gregorian, era: 1, year: year, month: 1, day: 1)
    guard let date = comp.date else {
    return nil
    }
    let jComp = japanease.dateComponents([.era, .year], from: date)
    return jComp.era
    }

    func startDate(forEra era:Int) -> Date {
    let flags = Set<Calendar.Component>([Calendar.Component.era, Calendar.Component.year, Calendar.Component.month, Calendar.Component.day])
    let japanese = Calendar(identifier: Calendar.Identifier.japanese)
    var year = 1, month = 1, day = 1
    var dateComponents = DateComponents(calendar: japanese,
    era: era,
    year: year,
    month: month,
    day: day)
    var date = japanese.date(from: dateComponents)!
    dateComponents = japanese.dateComponents(flags, from: date)
    if ( dateComponents.era! != era ) {
    while dateComponents.era! < era {
    month += 1
    dateComponents = DateComponents(calendar: japanese,
    era: era,
    year: year,
    month: month,
    day: day)
    date = japanese.date(from: dateComponents)!
    dateComponents = japanese.dateComponents(flags, from: date)
    }
    month -= 1
    dateComponents = DateComponents(calendar: japanese,
    era: era,
    year: year,
    month: month,
    day: day)
    date = japanese.date(from: dateComponents)!
    dateComponents = japanese.dateComponents(flags, from: date)
    while dateComponents.era! < era {
    day += 1
    dateComponents = DateComponents(calendar: japanese,
    era: era,
    year: year,
    month: month,
    day: day)
    date = japanese.date(from: dateComponents)!
    dateComponents = japanese.dateComponents(flags, from: date)
    }
    }
    return date
    }

    func printEras(startYear:Int, stopYear:Int) {
    guard let start = era(year: startYear) else {
    return
    }
    guard let stop = era(year: stopYear) else {
    return
    }
    format.dateStyle = .long
    format.timeStyle = .none
    for era in start...stop {
    let date = startDate(forEra: era)
    let string = format.string(from: date)
    let gYear = gregorian.component(.year, from: date)
    print("\(gYear)年(\(era))"+string)
    }
    }

    ///////////////////////////////////////////////

    var startYear = 2001
    var length = 10

    let argv = ProcessInfo.processInfo.arguments

    // print("count = \(argv.count)")

    if argv.count > 1 {
    let value = Int(argv[1])!
    if value < 2100 && value > 645 {
    startYear = value
    }
    }

    if argv.count > 2 {
    if argv[2] == "-length" {
    if argv.count > 3 {
    if let value = Int(argv[3]) {
    if value > 0 {
    length = value
    }
    }
    }
    } else {
    let value = Int(argv[2])!
    if value < 2100 && value > 645 {
    let stopYear = value
    if stopYear > startYear {
    length = stopYear - startYear
    }
    }
    }
    }

    printEras(startYear: startYear, stopYear: startYear+length)