Objective c 目标c中当月的星期二数

Objective 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天的月份,第一个必须在星期日、星期一或

我正在寻找一种方法来计算目标C中当前月份的周二天数

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

我在网上看到了用Excel实现的解决方案,但我正在努力将其转换为Objective C


谢谢你的帮助!很长一段时间,第一次。

在查看
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的一些方法。是的,当然,但有一个特定的算法来确定它,我希望有人知道或知道如何计算。一个月内的特定天数没有单一的方法。你会学到更多如果你自己能想出算法的话。这是非常棒的,非常有用的一步一步的说明!非常感谢!