获取不超过两个字母的日历工作日符号

Getting Calendar weekday symbols consisting of no more than two letters

我需要以最短的格式(两个字母)获取工作日符号。我使用 CalendarshortStandaloneWeekdaySymbols 属性,但是这个 return 的星期几包含三个字母:

Calendar.current.shortStandaloneWeekdaySymbols

结果:

["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]

我想得到这样的东西(英语):

["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]

可以通过 StringremoveLast() 方法手动删除最后一个字符,但是,我认为对于某些语言环境,结果是错误的。

那么,有没有办法从 Calendar.

return 两个字母的工作日符号

Calendar 不提供 built-in 属性来获取工作日名称的 two-letter 缩写。但是,日期格式的 Unicode 标准确实提供了您所需要的。 EEEEEE 格式给出 two-letter 工作日名称,cccccc 给出 two-letter 独立工作日名称。

这是一个 Calendar 扩展程序,可为您提供这些值:

extension Calendar {
    var shorterWeekdaySymbols: [String] {
        return symbolsFor("EEEEEE")
    }

    var shorterStandaloneWeekdaySymbols: [String] {
        return symbolsFor("cccccc")
    }

    private func symbolsFor(_ format: String) -> [String] {
        let df = DateFormatter()
        df.locale = self.locale
        df.calendar = self
        df.dateFormat = format
        let weekdays = self.range(of: .weekday, in: .year, for: Date())!
        return weekdays.map {
            let date = self.nextDate(after: Date(), matching: DateComponents(weekday: [=10=]), matchingPolicy: .strict)!
            return df.string(from: date)
        }
    }
}

用法示例:

print(Calendar.current.shorterWeekdaySymbols)
print(Calendar.current.shorterStandaloneWeekdaySymbols)

以西班牙为例:

var calES = Calendar.current
calES.locale = Locale(identifier: "es_ES")
print(calES.shorterWeekdaySymbols)
print(calES.shorterStandaloneWeekdaySymbols)

这已经针对每个日历的每个语言环境进行了测试,force-unwraps 的 none 导致了一个问题。