Created
May 6, 2021 13:43
-
-
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
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 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