目标c中当月的星期二数

use*_*460 3 calendar objective-c weekday

我正在寻找一种方法来计算目标C中当月的星期二数量.

例如,如果代码今天(2012年7月16日)运行,它将输出5,因为2012年7月有5个星期二(第3天,第10天,第17天,第24天和第31天).

我已经在网上看到了在Excel中使用它的解决方案,但我正在努力将其转换为Objective C.

谢谢你的帮助!好久不见,第一次.

rob*_*off 6

我们需要一个日历:

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
Run Code Online (Sandbox Code Playgroud)

现在让我们得到当前的月份和年份:

    NSDate *now = [NSDate date];
    NSDateComponents *monthAndYear = [calendar components:NSMonthCalendarUnit | NSYearCalendarUnit fromDate:now];
Run Code Online (Sandbox Code Playgroud)

我们可以使用它来获得当前月份和年份的第一个星期二:

    NSDateComponents *firstTuesdayComponents = [monthAndYear copy];
    firstTuesdayComponents.weekday = 3; // Sunday = 1
    firstTuesdayComponents.weekdayOrdinal = 1; // First Tuesday
    NSDate *firstTuesday = [calendar dateFromComponents:firstTuesdayComponents];
Run Code Online (Sandbox Code Playgroud)

我们也可以使用它来获得下个月的第一天:

    NSDateComponents *firstOfNextMonthComponents = [monthAndYear copy];
    firstOfNextMonthComponents.month += 1;
    firstOfNextMonthComponents.day = 1;
    NSDate *firstOfNextMonth = [calendar dateFromComponents:firstOfNextMonthComponents];
Run Code Online (Sandbox Code Playgroud)

现在我们可以询问两个日期之间的天数:

    NSDateComponents *differenceComponents = [calendar components:NSDayCalendarUnit fromDate:firstTuesday toDate:firstOfNextMonth options:0];
Run Code Online (Sandbox Code Playgroud)

大多数星期有七天和一个星期二,所以我们应该将天数除以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);
Run Code Online (Sandbox Code Playgroud)

现在让我们跳进时间机器来测试它:

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.
Run Code Online (Sandbox Code Playgroud)