我希望能够获取一个字符串数组年份,类似于月份符号。例如:[2017, 2018, 2019, 2020,... 2100]
我可以通过年份来实现:
let formatter = DateFormatter()
let monthComponents = formatter.monthSymbols
但我无法用同样的方法处理年份。有什么帮助吗?
我认为这样的东西不存在。任意年份列表无法像具体的月份名称列表一样处理。
let years = (2017...2100).map { String($0) }
可能是实现您所需功能最简洁的方法。
让当前日期等于Date()
获取当前日历
获取当前年份,用component(.year, from: currentDate)方法获取
将当前年份到2100年之间的年份存为数组years,用了map方法和String($0)转换。
- steibourDateFormatter
的示例,它允许您指定年份范围:extension DateFormatter {
func years<R: RandomAccessCollection>(_ range: R) -> [String] where R.Iterator.Element == Int {
setLocalizedDateFormatFromTemplate("yyyy")
var comps = DateComponents(month: 1, day: 1)
var res = [String]()
for y in range {
comps.year = y
if let date = calendar.date(from: comps) {
res.append(string(from: date))
}
}
return res
}
}
这里是一段小测试代码:
let df = DateFormatter()
print(df.years(2017...2100))
此代码利用用户的语言环境和日历。
当用户的语言环境为阿拉伯语或其他使用非0-9数字的语言环境时,您会看到明显的差异。
感谢Leo Dabus的建议,这可以简化为:
extension DateFormatter {
func years<R: RandomAccessCollection>(_ range: R) -> [String] where R.Iterator.Element == Int {
setLocalizedDateFormatFromTemplate("yyyy")
let res = range.flatMap { DateComponents(calendar: calendar, year: $0).date }.flatMap { string(from: $0) }
return res
}
}
(2017...2100).flatMap{ DateComponents(calendar: .current, year: $0).date
- Leo Dabus