Created
May 6, 2021 13:40
-
-
Save eienf/fdd2d190968c75d92249c1b9901c0472 to your computer and use it in GitHub Desktop.
print first year of the era include specified year
This file contains 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 characters
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) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment