首页 > 解决方案 > 获取包含不超过两个字母的日历工作日符号

问题描述

我需要获取工作日符号,但格式最短(两个字母)。我使用Calendar'shortStandaloneWeekdaySymbols属性,但是这会返回带有三个字母的星期几:

Calendar.current.shortStandaloneWeekdaySymbols

结果:

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

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

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

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

那么,有没有办法从Calendar.

标签: iosswiftstringcalendar

解决方案


Calendar不提供用于获取工作日名称的两个字母缩写的内置属性。但是,日期格式的 Unicode 标准确实提供了您需要的内容。该格式EEEEEE给出了一个由两个字母组成的工作日名称,并cccccc给出了一个由两个字母组成的独立工作日名称。

这是一个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: $0), 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)

这已经在每个日历的每个语言环境中进行了测试,并且没有任何强制展开导致问题。


推荐阅读