Created
May 6, 2021 13:40
-
-
Save eienf/fdd2d190968c75d92249c1b9901c0472 to your computer and use it in GitHub Desktop.
Revisions
-
eienf created this gist
May 6, 2021 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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)