尝试确定iOS当月的当前日期是否为3天或更短

时间:2014-08-18 16:43:24

标签: ios nsdate nscalendar nsdatecomponents

我正在尝试确定当前日期是否实际上是从月底开始的三天或更短时间。换句话说,如果我在八月,那么如果它是28,29,30或31,我希望得到警告。如果我在二月,那么我希望在25,26,27或28(或甚至29)时得到通知。在闰年的情况下,我将从26日起被提醒。

我的问题是我不知道如何进行这样的检查,以便它适用于任何月份。这是我到目前为止的代码:

-(BOOL)monthEndCheck {

   NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay |  NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
   NSInteger day = [components day];
   NSInteger month = [components month];
   NSInteger year = [components year];

   if (month is 3 days or less from the end of the month for any month) {

     return YES;

   }  else {

     return NO;

   }

}

因为有28个月,30天和31天的月份,我想要一个动态解决方案,而不是为每个条件创建一系列if / else语句。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

这就是你在这个月的最后一天得到的结果:

NSDate *curDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar     components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit     fromDate:curDate]; // Get necessary date components

// set last of month
[comps setMonth:[comps month]+1];
[comps setDay:0];
NSDate *tDateMonth = [calendar dateFromComponents:comps];
NSLog(@"%@", tDateMonth);

来源:Getting the last day of a month

编辑(另一个来源):How to retrive Last date of month give month as parameter in iphone

现在您可以从当前日期算起来。 如果< 3做你想做的事。

也许是这样的:

NSTimeInterval distanceBetweenDates = [date1 timeIntervalSinceDate:date2];
double timeInSecondsFor3Days = 280000; //Better use NSDateComponents here!
NSInteger hoursBetweenDates = distanceBetweenDates / timeInSecondsFor3Days;

但是我没有测试^^

编辑:感谢Aaron。请NSDateComponents计算三天的时间!

答案 1 :(得分:2)

首先,您必须计算当天的开始(即今天00.00)。 否则,当前一天计算时不会算作一整天 今天和下个月开始之间的差异。

NSDate *now = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *startOfToday;
[cal rangeOfUnit:NSCalendarUnitDay startDate:&startOfToday interval:NULL forDate:now];

可以使用rangeOfUnit:...计算下个月的开始时间 (使用"statement expression"来表示:)

NSDate *startOfNextMonth = ({
    NSDate *startOfThisMonth;
    NSTimeInterval lengthOfThisMonth;
    [cal rangeOfUnit:NSCalendarUnitMonth startDate:&startOfThisMonth interval:&lengthOfThisMonth forDate:now];
    [startOfThisMonth dateByAddingTimeInterval:lengthOfThisMonth];
});

最后是天数的差异:

NSDateComponents *comp = [cal components:NSCalendarUnitDay fromDate:startOfToday toDate:startOfNextMonth options:0];
if (comp.day < 4) {
    // ...
}