NSCalendar返回错误的一周

时间:2014-08-10 13:27:59

标签: objective-c nscalendar

我有这个代码,它带有工作日的名称和提供的值,今天是2014年8月10日,应该返回星期日,但代码是星期二返回,为什么?

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

        NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
        [dateComponents setWeekday:10];
        [dateComponents setWeekdayOrdinal:1];
        [dateComponents setYear:2014];
        [dateComponents setMonth:8];

        NSDate *tempDate = [gregorian dateFromComponents:dateComponents];

        NSDateFormatter *format = [[NSDateFormatter alloc] init];
        [format setDateFormat:@"EEEE"];

        NSString *retval = [format stringFromDate:tempDate];

        NSLog(@"Today -> %@",retval);

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。在格里高利历中,首先weekday属性可以是1到7之间的数字。

来自NSDateComponents documentation

  

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

因此,如果您想创建代表星期日的NSDateComponents,则必须将weekDay属性值设置为1。

您还必须更改weekdayOrdinal属性的值。

来自NSDateComponents documentation

  

工作日序数单位表示下一个较大日历单位中工作日的位置,例如月份。例如,2是该月第二个星期五的工作日序数单位。

在这种情况下,您必须将其值设置为2,因为您要为该月的第二个星期日创建NSDateComponents

以下是更改的代码:

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setWeekday:1];
[dateComponents setWeekdayOrdinal:2];
[dateComponents setYear:2014];
[dateComponents setMonth:8];

话虽如此,使用day属性可能很简单,完全忘记了weekdayweekdayOrdinal属性:

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:10];
[dateComponents setYear:2014];
[dateComponents setMonth:8];