Ios 代码返回的日历天数不正确

Ios 代码返回的日历天数不正确,ios,calendar,nsdate,Ios,Calendar,Nsdate,我正在制作一个日历,用于练习,我试图找出一年中某个月的天数 直到今天,我才成功地找到了正确的数值,突然间,我没有得到正确的二月天数。早些时候,它工作得很好,我没有对代码做任何更改 我的代码: -(NSDate *)startOfMonth:(NSInteger)calendarMonth :(NSInteger)calendarYear { NSDate *date=[NSDate date]; NSCalendar * calendar = [NSCalendar curren

我正在制作一个日历,用于练习,我试图找出一年中某个月的天数

直到今天,我才成功地找到了正确的数值,突然间,我没有得到正确的二月天数。早些时候,它工作得很好,我没有对代码做任何更改

我的代码:

-(NSDate *)startOfMonth:(NSInteger)calendarMonth :(NSInteger)calendarYear
{
    NSDate *date=[NSDate date];
    NSCalendar * calendar = [NSCalendar currentCalendar];

    NSDateComponents * comps = [calendar components: NSCalendarUnitYear | NSCalendarUnitMonth |NSCalendarUnitDay fromDate:date];

    [comps setMonth:calendarMonth];

    [comps setYear:calendarYear];

    NSDate * monthOnlyDate = [calendar dateFromComponents:comps];

    NSDateComponents * currentDateComponents = [calendar components:     NSCalendarUnitYear | NSCalendarUnitMonth fromDate:monthOnlyDate ];

    self.numberOfDays = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:monthOnlyDate].length ;

    NSLog(@"NUMBER OF DAYS==%li",(long)self.numberOfDays);

    NSDate * startOfAnyMonth = [calendar dateFromComponents: currentDateComponents];
    NSDateFormatter *weekDay = [[NSDateFormatter alloc] init];
    [weekDay setDateFormat:@"EEE"];
    NSString * currentDay =[NSString stringWithFormat:@"%@",[weekDay stringFromDate:startOfAnyMonth]];
    [self updateFirstDateOFCurrentMonth:currentDay];
    return startOfAnyMonth;
}

我猜它在几天前起作用,而在2月份今天不起作用的原因是2月份没有第30天(即今天),您正在基于当前日期创建date对象,然后更改月份,而不检查日期

但除此之外,您的逻辑对我来说还不太清楚-如果您想要的是获得指定月份的第一天,为什么不基于用户指定的组件创建NSDate对象,同时为day组件提供1作为值?这里要做的是基于今天创建一个日期,更改组件,然后检查它们以获得手动设置的值(因此已经知道)

另外,如果这是出于实践目的,正如您所提到的,我强烈建议将所有参数的名称作为方法声明的一部分提供,否则调用它的可读性会降低。在这种情况下,我会考虑将方法名改为:

- (NSDate *)startOfMonth:(NSInteger)calendarMonth ofYear:(NSInteger)calendarYear

我希望这有帮助。祝你好运。

我猜它在几天前工作,而在2月份今天不工作的原因是2月份没有第30天(即今天),并且你正在基于当前日期创建日期对象,然后更改月份,而不检查日期

但除此之外,您的逻辑对我来说还不太清楚-如果您想要的是获得指定月份的第一天,为什么不基于用户指定的组件创建NSDate对象,同时为day组件提供1作为值?这里要做的是基于今天创建一个日期,更改组件,然后检查它们以获得手动设置的值(因此已经知道)

另外,如果这是出于实践目的,正如您所提到的,我强烈建议将所有参数的名称作为方法声明的一部分提供,否则调用它的可读性会降低。在这种情况下,我会考虑将方法名改为:

- (NSDate *)startOfMonth:(NSInteger)calendarMonth ofYear:(NSInteger)calendarYear

我希望这有帮助。祝你好运。

太好了,它成功了。非常感谢。我将开始使用参数名称的方法声明。我正在尝试通过传递月份和年份来获取月初的日期。太好了,它成功了。非常感谢。我将开始使用参数名称的方法声明。我正在尝试通过传递月份和年份来获取月初的日期。