Objective c 目标c中当月的星期二数
我正在寻找一种方法来计算目标C中当前月份的周二天数 例如,如果代码今天(2012年7月16日)运行,它将输出5,因为2012年7月有5个星期二(第3、10、17、24和31日) 我在网上看到了用Excel实现的解决方案,但我正在努力将其转换为Objective CObjective c 目标c中当月的星期二数,objective-c,calendar,weekday,Objective C,Calendar,Weekday,我正在寻找一种方法来计算目标C中当前月份的周二天数 例如,如果代码今天(2012年7月16日)运行,它将输出5,因为2012年7月有5个星期二(第3、10、17、24和31日) 我在网上看到了用Excel实现的解决方案,但我正在努力将其转换为Objective C 谢谢你的帮助!很长一段时间,第一次。在查看cal 2012、cal 2011和cal 2000的输出时,我得出了一些结论: 每个月有四到五个星期二 要查找包含五个星期二的月份,请注意: 对于31天的月份,第一个必须在星期日、星期一或
谢谢你的帮助!很长一段时间,第一次。在查看
cal 2012
、cal 2011
和cal 2000
的输出时,我得出了一些结论:
每个月有四到五个星期二
要查找包含五个星期二的月份,请注意:
- 对于31天的月份,第一个必须在星期日、星期一或星期二
- 在有30天的几个月里,第一天必须在星期一或星期二
- 在有29天的几个月里,第一天必须在星期二
希望这是一个更容易解决的问题。我们需要一个日历:
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
现在让我们获取当前月份和年份:
NSDate *now = [NSDate date];
NSDateComponents *monthAndYear = [calendar components:NSMonthCalendarUnit | NSYearCalendarUnit fromDate:now];
NSDateComponents *firstTuesdayComponents = [monthAndYear copy];
firstTuesdayComponents.weekday = 3; // Sunday = 1
firstTuesdayComponents.weekdayOrdinal = 1; // First Tuesday
NSDate *firstTuesday = [calendar dateFromComponents:firstTuesdayComponents];
我们可以使用它来获取当前月份和年份的第一个星期二:
NSDate *now = [NSDate date];
NSDateComponents *monthAndYear = [calendar components:NSMonthCalendarUnit | NSYearCalendarUnit fromDate:now];
NSDateComponents *firstTuesdayComponents = [monthAndYear copy];
firstTuesdayComponents.weekday = 3; // Sunday = 1
firstTuesdayComponents.weekdayOrdinal = 1; // First Tuesday
NSDate *firstTuesday = [calendar dateFromComponents:firstTuesdayComponents];
我们也可以用它来获得下个月的第一天:
NSDateComponents *firstOfNextMonthComponents = [monthAndYear copy];
firstOfNextMonthComponents.month += 1;
firstOfNextMonthComponents.day = 1;
NSDate *firstOfNextMonth = [calendar dateFromComponents:firstOfNextMonthComponents];
现在我们可以询问两个日期之间的天数:
NSDateComponents *differenceComponents = [calendar components:NSDayCalendarUnit fromDate:firstTuesday toDate:firstOfNextMonth options:0];
大多数星期有七天和一个星期二,所以我们应该把天数除以7。如果还有余数,我们应该把它取整,因为我们从星期二开始计算
int tuesdayCount = (differenceComponents.day + 6) / 7; // Adding 6 makes the integer division round up.
NSLog(@"There are %d Tuesdays in month %d of year %d.", tuesdayCount, (int)monthAndYear.month, (int)monthAndYear.year);
现在让我们跳到时间机器中进行测试:
There are 5 Tuesdays in month 1 of year 2012.
There are 4 Tuesdays in month 2 of year 2012.
There are 4 Tuesdays in month 3 of year 2012.
There are 4 Tuesdays in month 4 of year 2012.
There are 5 Tuesdays in month 5 of year 2012.
There are 4 Tuesdays in month 6 of year 2012.
There are 5 Tuesdays in month 7 of year 2012.
There are 4 Tuesdays in month 8 of year 2012.
There are 4 Tuesdays in month 9 of year 2012.
There are 5 Tuesdays in month 10 of year 2012.
There are 4 Tuesdays in month 11 of year 2012.
There are 4 Tuesdays in month 12 of year 2012.
使用基于sarnold在其回答中所做相同观察的算法,这应该可以做到:
- (NSUInteger)numberOfTuesdaysInMonthContainingDate:(NSDate *)date
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger numDaysInMonth = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date].length;
NSDate *firstDayOfMonth;
NSTimeInterval firstDayOfMonthLength;
if (![calendar rangeOfUnit:NSMonthCalendarUnit startDate:&firstDayOfMonth interval:&firstDayOfMonthLength forDate:date]) {
NSLog(@"Unable to calculate first day of the month for %@", date);
return 0;
}
NSUInteger firstDayOfTheMonthWeekday = [calendar ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:firstDayOfMonth];
// The following is for Tuesday only, the math is more complex for an abitrary weekday
NSUInteger numTuesdays = 4;
NSUInteger minValidWeekday = 32 - numDaysInMonth;
if (firstDayOfTheMonthWeekday >= minValidWeekday && firstDayOfTheMonthWeekday <= 3) {
numTuesdays = 5;
}
return numTuesdays;
}
-(NSUInteger)numberoftuesdaysinmonth包含日期:(NSDate*)日期
{
NSCalendar*日历=[NSCalendar currentCalendar];
NSUInteger numDaysInMonth=[日历范围单位:nsdayscalendarUnit inUnit:NSMonthCalendarUnit forDate:date]。长度;
NSDate*每月第一天;
n时间间隔月长的第一天;
if(![calendar rangeOfUnit:NSMonthCalendarUnit开始日期:&firstDayOfMonth间隔:&firstDayOfMonth长度日期:日期]){
NSLog(@“无法计算%@”月份的第一天,日期);
返回0;
}
NSUInteger每月第一天=[日历顺序功能:NSWeekdayCalendarUnit In单位:NSWeekCalendarUnit forDate:每月第一天];
//以下仅适用于周二,对于一个临时工作日,数学更为复杂
NSU整数numTuesdays=4;
NSU整数minValidWeekday=32—numDaysInMonth;
如果(Monthweekday>=minValidWeekday&&firstdayMonthweekday我想你会使用NSCalendar的一些方法。是的,当然,但有一个特定的算法来确定它,我希望有人知道或知道如何计算。一个月内的特定天数没有单一的方法。你会学到更多如果你自己能想出算法的话。这是非常棒的,非常有用的一步一步的说明!非常感谢!