代码在日历中返回不正确的天数
Code is returning an incorrect number of days in calendar
我正在为练习目的制作日历,我正在尝试查找特定年份的特定月份的天数。
直到今天我都成功地找到了正确的值,突然间我只得到了 2 月的正确天数。它之前运行良好,我没有对我的代码进行任何更改。
我的代码:
-(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 天(今天),而你正在创建日期对象基于当前日期,然后更改月份,而不检查日期。
但更重要的是,我不太清楚你的逻辑 - 如果你想要获取指定月份的第一天,为什么不根据指定的组件创建 NSDate 对象用户,同时提供 1 作为日期组件的值?您在这里所做的是创建一个基于今天的日期,更改组件,然后检查它们以获取您手动设置的值(因此已经知道)。
此外,如果这是出于练习目的,如您所述,我强烈建议为所有参数提供名称作为方法声明的一部分,否则调用它的可读性会降低。在这种情况下,我会考虑将方法名称更改为:
- (NSDate *)startOfMonth:(NSInteger)calendarMonth ofYear:(NSInteger)calendarYear
希望对您有所帮助。祝你好运。
我正在为练习目的制作日历,我正在尝试查找特定年份的特定月份的天数。
直到今天我都成功地找到了正确的值,突然间我只得到了 2 月的正确天数。它之前运行良好,我没有对我的代码进行任何更改。
我的代码:
-(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 天(今天),而你正在创建日期对象基于当前日期,然后更改月份,而不检查日期。
但更重要的是,我不太清楚你的逻辑 - 如果你想要获取指定月份的第一天,为什么不根据指定的组件创建 NSDate 对象用户,同时提供 1 作为日期组件的值?您在这里所做的是创建一个基于今天的日期,更改组件,然后检查它们以获取您手动设置的值(因此已经知道)。
此外,如果这是出于练习目的,如您所述,我强烈建议为所有参数提供名称作为方法声明的一部分,否则调用它的可读性会降低。在这种情况下,我会考虑将方法名称更改为:
- (NSDate *)startOfMonth:(NSInteger)calendarMonth ofYear:(NSInteger)calendarYear
希望对您有所帮助。祝你好运。