3

我得到了一个 NSDate,例如 1/6 -12(星期五),并试图找出它是星期几。我的一周从星期一开始,所以星期五应该是工作日 5。

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [calendar setFirstWeekday:2];
    NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit fromDate:firstOfJulyDate];
    NSLog(@"weekday %i",components.weekday);

输出:工作日 6

不管我将 setFirstWeekday 设置为什么,输出始终为 6。我做错了什么?

4

3 回答 3

9

尝试做这样的事情:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setFirstWeekday:2]; // Sunday == 1, Saturday == 7
NSUInteger adjustedWeekdayOrdinal = [gregorian ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
NSLog(@"Adjusted weekday ordinal: %d", adjustedWeekdayOrdinal);
于 2012-06-13T17:09:12.027 回答
7

正如 NSDateComponents 的文档所说:

工作日单位是数字 1 到 n,其中 n 是一周中的天数。例如,在公历中,n 为 7,星期日由 1 表示。

此值在使用它的日历的上下文中进行解释 - 请参阅日期和时间编程指南中的“日历、日期组件和日历单位”。

如果您查看 NSGregorianCalendar,正如预期的那样,它将 1-7 的含义定义为 Sunday-Saturday。

调用 setFirstWeekday:2 意味着你的星期从星期一开始,用于计算这是否是本月的第二周等。这并不意味着你的星期一突然变成星期日。2012 年 6 月 1 日仍然是星期五,而不是星期四,所以你得到 6,而不是 5。

如果您想知道从一周开始算起多少天,而不是工作日,这很容易:

(components.weekday - calendar.firstWeekday + 1) % 7
于 2012-06-13T19:54:32.510 回答
3

NSDateComponents不会自动同步所有组件,例如:

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *component = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSWeekdayCalendarUnit fromDate:date];

currentMonth = component.month;


// printing the next 3 month's start dates MUST have the setYear! 

for (int i = currentMonth; i < currentMonth + 3; i++) {

    [components setDay:1];
    [components setMonth:i];
    [components setYear:2014];

    NSDate *newDate = [calendar dateFromComponents:components];

    NSDateComponents *components2 = [calendar components:NSDayCalendarUnit |NSMonthCalendarUnit | NSWeekdayCalendarUnit fromDate:newDate];

    monthInt = [components2 month];
    weekIndex = [components2 weekday];
}

确保为跨入下一年的日期编写代码(在循环之前包含一个简单的 if 语句)

于 2014-06-03T02:02:21.167 回答