我需要计算某个特定日期的工作日,但是,根据日历,一周可以在星期一和星期日的星期日出现
所以我想设置它,从周一开始,使用
[[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);
}
返回相同的数字,但为什么?
答案 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
}