Skip to content

Instantly share code, notes, and snippets.

@eienf
Created May 6, 2021 13:40
Show Gist options
  • Save eienf/fdd2d190968c75d92249c1b9901c0472 to your computer and use it in GitHub Desktop.
Save eienf/fdd2d190968c75d92249c1b9901c0472 to your computer and use it in GitHub Desktop.
print first year of the era include specified year
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