如何在Swift中获取类似于monthSymbols的年份字符串数组?

6

我希望能够获取一个字符串数组年份,类似于月份符号。例如:[2017, 2018, 2019, 2020,... 2100]

我可以通过年份来实现:

let formatter = DateFormatter()
let monthComponents = formatter.monthSymbols

但我无法用同样的方法处理年份。有什么帮助吗?

只需使用dateFormat为“yyyy”的DateFormatter,将包含每年第一天的日期数组映射并获取它们的字符串表示即可。 - Leo Dabus
@LeoDabus 喜欢我的回答吗? :) - rmaddy
@rmaddy 是的,但你可以简化创建日期的方式。无需使用 flatMap 指定日期和月份 (2017...2100).flatMap{ DateComponents(calendar: .current, year: $0).date - Leo Dabus
2个回答

12

我认为这样的东西不存在。任意年份列表无法像具体的月份名称列表一样处理。

let years = (2017...2100).map { String($0) } 可能是实现您所需功能最简洁的方法。


7
我只是:让当前日期等于Date() 获取当前日历 获取当前年份,用component(.year, from: currentDate)方法获取 将当前年份到2100年之间的年份存为数组years,用了map方法和String($0)转换。 - steibour
适用于Swift 4.0 - J A S K I E R

2
如果您只需要将2017-2100年的数字转换为字符串,那么其他答案就可以了。但是如果您需要一个用户给定语言环境下本地化的年份列表,则需要进行更多操作。
以下是一个扩展DateFormatter的示例,它允许您指定年份范围:
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
    }
}

1
@LeoDabus - 感谢您的建议。 - rmaddy
@LeoDabus,现在它不能使用开放范围了。这就是为什么我的代码稍微复杂一些的原因。它可以处理开放范围、闭合范围,甚至数组。我还在努力想办法将其限制为只能处理“Int”集合。 - rmaddy
我认为数组不是一个好的选择。为什么要允许重复元素或更改年份顺序呢? - Leo Dabus
1
@LeoDabus 很好。谢谢。 - rmaddy
1
@LeoDabus 调试。 - rmaddy
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接