Skip to content

Instantly share code, notes, and snippets.

@eienf
Created May 6, 2021 13:43
Show Gist options
  • Save eienf/3cc17a4e93b7c2d4466beb340a5b6f3f to your computer and use it in GitHub Desktop.
Save eienf/3cc17a4e93b7c2d4466beb340a5b6f3f to your computer and use it in GitHub Desktop.
print all years in specified era, era number = 1 is Taika, era number = 235 is Heisei
import Foundation
let japanese = Calendar(identifier: .japanese)
let gregorian = Calendar(identifier: .gregorian)
let locale = Locale(identifier: "ja")
let format = DateFormatter()
format.calendar = japanese
format.dateFormat = "Gy年"
format.locale = locale
///////////////////////////////////////////////
// swiftc -o erayears erayears.swift
// ./erayears (235)
// ./erayears eraNumber
// print all years in specified era, era number = 1 is Taika, era number = 235 is Heisei
///////////////////////////////////////////////
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 printEraYears(era:Int) {
format.dateStyle = .long
format.timeStyle = .none
let date = startDate(forEra: era)
let gYear = gregorian.component(.year, from: date)
print(format.string(from: date)+"(\(gYear)年)")
var year = 2
repeat {
let comp = DateComponents(calendar: japanese, era: era, year: year, month: 1, day: 1)
if let date = japanese.date(from: comp) {
let flags = Set<Calendar.Component>([.era])
let dateComps = japanese.dateComponents(flags, from: date)
if dateComps.era != era {
return
}
let gYear = gregorian.component(.year, from: date)
print(format.string(from: date)+"(\(gYear)年)")
} else {
return
}
year += 1
} while year <= 100
}
///////////////////////////////////////////////
var era = 235
let argv = ProcessInfo.processInfo.arguments
// print("count = \(argv.count)")
if argv.count > 1 {
let value = Int(argv[1])!
if value < 235 && value > 0 {
era = value
}
}
printEraYears(era: era)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment