如何在Swift中从系统获取工作日数组?

20

我如何从系统(可能是从NSDate)中获取一周的日期数组?

到目前为止,我只能获取当前的日期,但我希望能够获取所有工作日的日期数组。

如果一周的第一天是周一,我的数组应该是这样的:

[ Mon, Tue, Wed... ]
如果一周的第一天是星期日,我的数组将如下所示:
[Sun, Mon, Tue... ]

代码:

let dateNow = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond | .CalendarUnitYear , fromDate: dateNow) 

/*This is the way how i take system time */ 

let format = NSDateFormatter()
format.dateFormat = "EEE"
stringDay = format.stringFromDate(dateNow) 
4个回答

54

请尝试使用这些属性

let fmt = NSDateFormatter()
fmt.weekdaySymbols // -> ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
fmt.shortWeekdaySymbols // -> ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
fmt.veryShortWeekdaySymbols // -> ["S", "M", "T", "W", "T", "F", "S"]
fmt.standaloneWeekdaySymbols // -> ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
fmt.shortStandaloneWeekdaySymbols // -> ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
fmt.veryShortStandaloneWeekdaySymbols // -> ["S", "M", "T", "W", "T", "F", "S"]

看起来无论 .calendar.firstWeekday 属性如何,它们似乎总是返回 Sun ... Sat 数组。因此,您需要手动进行旋转

let firstWeekday = 2 // -> Monday

var symbols = fmt.shortWeekdaySymbols
symbols = Array(symbols[firstWeekday-1..<symbols.count]) + symbols[0..<firstWeekday-1]
// -> ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]

1
您可以在后续的 Swift 版本中使用 Calendar.current.firstWeekDay 来获取当前区域设置的第一天,而无需手动提供。 - Alexander Sandberg

1
现在我们可以使用 Calendar.current 代替 DateFormatter:
    Calendar.current.weekdaySymbols // -> ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    Calendar.current.shortWeekdaySymbols // -> ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
    Calendar.current.veryShortWeekdaySymbols // -> ["S", "M", "T", "W", "T", "F", "S"]
    Calendar.current.standaloneWeekdaySymbols // -> ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    Calendar.current.shortStandaloneWeekdaySymbols // -> ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
    Calendar.current.veryShortStandaloneWeekdaySymbols // -> ["S", "M", "T", "W", "T", "F", "S"]

1

Swift

创建一个 DateFrmatter

let formatter: DateFormatter = {
    let formatter = DateFormatter()

    //  You can setup the formatter here. For example, setting the locale to return the weekdays in the desired language.
    formatter.locale = .init(identifier: "fa")

    return formatter
}()

注意 创建格式化程序是一项非常昂贵的任务,您可能会在主线程中遇到延迟。如果您认为将来还需要它,请尝试缓存它。

现在您可以使用:

formatter.weekdaySymbols \\ ["یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"]
formatter.veryShortWeekdaySymbols \\ ["ی", "د", "س", "چ", "پ", "ج", "ش"]

请注意,您可以使用en标识符来获取上述所有内容的英文版本:

,,,
formatter.locale = .init(identifier: "en")
,,,

formatter.weekdaySymbols // -> ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
formatter.shortWeekdaySymbols // -> ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
formatter.veryShortWeekdaySymbols // -> ["S", "M", "T", "W", "T", "F", "S"]

-3
如果你想把周一作为第一天,你可以使用这个扩展。
extension SequenceType where Generator.Element == String {
    func mondayFirst(withSunday: (Bool)) -> [String] {
        var tempWeek = self as! [String]

        let tempDay = tempWeek.first

        tempWeek.removeFirst()

        if (!withSunday) {
            tempWeek.append(tempDay!)
        }

        return tempWeek
    }
}

2
将与日历相关的功能扩展SequenceType并不是一个好主意。 - Rudolf Adamkovič

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