6

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

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

[[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);
}

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

4

3 回答 3

10

你看到的行为是正确的。工作日组件不受 firstWeekday 属性的影响。如果您有一个代表星期天的日期,那么无论您是从那个星期天还是星期一开始您的一周,它始终是星期天。这应该影响的是日期组件的 week 属性中的周数。

于 2013-06-01T19:27:08.277 回答
5

我相信您需要使用该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:调用中。

于 2013-06-01T19:20:40.050 回答
0

为不同的 firstWeekday 案例获取更正的工作日编号的有用功能

斯威夫特 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
}
于 2018-06-30T10:18:35.380 回答