【问题标题】:NSCalendar, why does setting the firstWeekday doesn't effect calculation outcome?NSCalendar,为什么设置 firstWeekday 不会影响计算结果?
【发布时间】:2013-05-28 08:17:30
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios cocoa nsdate nscalendar


    【解决方案1】:

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

    【讨论】:

    • 所以无论第一个Weekday 点是多少,周日总是第0 个工作日?
    • 周日 1、周一 2、周二 3、周三 4、周五 5、周六 6
    • @Peter Lapisu 别忘了星期四! :-)
    • 详细来说,NSCalendar 的firstWeekDay 只会影响NSDateComponents 的weekOfMonth/weekOfYear/yearForWeekOfYear 属性。顺便说一句,NSCalendar 的 week 属性已被弃用,取而代之的是 weekOfMonth 和 weekOfYear。
    【解决方案2】:

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

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

    基本上,该电话询问给定日期的一周 (NSWeekCalendarUnit) 中的哪一天 (NSWeekdayCalendarUnit)。

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

    例如:

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

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

    【讨论】:

    • NSWeekCalendarUnit 已弃用:/
    • 也许可以试试其他周单位之一:NSWeekOfMonthCalendarUnit 或 NSWeekOfYearCalendarUnit。在这种情况下,它们并没有真正的意义,但值得一试。
    • 如果您发现在插入 NSWeekOfMonthCalendarUnit 或 NSWeekOfYearCalendarUnit 时得到奇怪的值,请尝试... NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]];
    【解决方案3】:

    为不同的 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 2011-09-12
      相关资源
      最近更新 更多