NSCalendar,为什么设置第一个周末不影响计算结果?

时间:2013-06-01 17:41:21

标签: ios cocoa nsdate nscalendar

我需要计算某个特定日期的工作日,但是,根据日历,一周可以在星期一和星期日的星期日出现

所以我想设置它,从周一开始,使用

[[NSCalendar currentCalendar] setFirstWeekday:2];

但是,计算结果是相同的

{
    [[NSCalendar currentCalendar] setFirstWeekday:1];
    NSDateComponents *weekdayComponents = [[NSCalendar currentCalendar] components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date];
    NSInteger weekday = [weekdayComponents weekday] - 1;
    NSLog(@"%d", weekday);
}
{
    [[NSCalendar currentCalendar] setFirstWeekday:2];
    NSDateComponents *weekdayComponents = [[NSCalendar currentCalendar] components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date];
    NSInteger weekday = [weekdayComponents weekday] - 1;
    NSLog(@"%d", weekday);
}

返回相同的数字,但为什么?

3 个答案:

答案 0 :(得分:9)

您看到的行为是正确的。工作日组件不受第一周天属性的影响。如果你有一个代表星期日的日期,你将在星期天或星期一开始你的一周,这将是一个星期天。这应该影响的是日期组件的周属性中的周数。

答案 1 :(得分:4)

我认为您需要使用ordinalityOfUnit:inUnit:forDate:方法而不是尝试提取日期组件。所以像这样:

NSUInteger weekday = [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];

基本上,该通话要求指定日期(NSWeekdayCalendarUnit)中的某一天(NSWeekCalendarUnit)。

如果这不起作用,您可能需要创建自己的日历,而不是尝试修改currentCalendar上的第一个工作日。

例如:

NSCalendarIdentifier calendarIdentifier = [[NSCalendar currentCalendar] calendarIdentifier];
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier] autorelease];
[calendar setFirstWeekday:2];

然后在calendar来电中使用新的[NSCalendar currentCalendar]对象而不是ordinalityOfUnit:inUnit:forDate:

答案 2 :(得分:0)

一个有用的函数,用于获取针对不同的firstWeekday案例的校正后的工作日编号

Swift 3.0

func dayOfWeek(day: Int, month: Int, year: Int) -> Int {
    let calendar = Calendar.current
    let dateComponents = DateComponents(year: year, month: month, day: day)

    guard let date = calendar.date(from: dateComponents) else {
        fatalError("Can't create date form specified date components")
    }

    var weekday = calendar.component(.weekday, from: date)

    //handling the case when calendar starts from Monday: firstWeekday == 2
    if calendar.firstWeekday == 2 {
        weekday = (weekday == 1) ? 7 : (weekday - 1)
    }

    return weekday
}