-1

我有一个日期组件,比如生日组件(其中包含月份和日期),我想检查它是否位于其他组件之间。比如说(beginDaYComponent 和 endDayComponent)。

我想检查我的生日部分是否介于这两个日期之间..?我怎样才能做到这一点,因为我还必须考虑边界情况,比如 2 月 29 日,并且我将 endDayCompnents 值设置为 3 代表月和 1 代表日。您可以查看下面的代码以获取更多信息。

 NSDateFormatter *dateFormat = [NSDateFormatter new];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];

    NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
    NSDateComponents *beginDayComponent = [[NSDateComponents alloc] init];
    NSDateComponents *endDayComponent = [[NSDateComponents alloc] init];

    NSCalendar *theCalendar = [NSCalendar currentCalendar];
    NSMutableArray* birthdayFitlerArray = [NSMutableArray new];

    for (NSString* dateString in birthdaysArray)
    {
        NSDate* birthdayDate = [dateFormat dateFromString:dateString];

        dayComponent.day = -1;
        NSDate* beginDate = [theCalendar dateByAddingComponents:dayComponent toDate:currentLeg.date options:0];

        dayComponent.day = 1;
        NSDate* endDate = [theCalendar dateByAddingComponents:dayComponent toDate:currentLeg.date options:0];

        beginDayComponent = [theCalendar  components:(NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:beginDate];
        endDayComponent = [theCalendar  components:(NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:endDate];

        NSDateComponents* birthdayComponents = [theCalendar  components:(NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:birthdayDate];

}

更新:

我想省略日期的 YEAR 组件。

4

4 回答 4

3

创建要用作上限和下限的两个 NSDate 对象。

然后使用 NSDate 的比较方法来查看你的日期是否在两个日期之间。您需要使用两次比较方法。查看比较方法的文档

  • 接收者和anotherDate完全相等,NSOrderedSame
  • 接收者在时间上晚于另一个日期,NSOrderedDescending
  • 接收者在时间上早于另一个日期,NSOrderedAscending。
于 2013-10-09T12:08:22.237 回答
1
NSDateComponents *firstDayDateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:randomdate];
[firstDayDateComponents setDay:1]; // set what you want here
[firstDayDateComponents setHour:0];
[firstDayDateComponents setMinute:0];

NSComparisonResult result = [randomdate compare:date_today];

if ( result == NSOrderedAscending) // if today's date is bigger than randomdate)
{
    // do stuff here
}

我认为从这里开始很简单:)

于 2013-10-09T12:14:16.230 回答
0

很简单。您可以使用laterDate:方法 ofNSDate或同时使用earlierDate:and laterDate:。请阅读有关这些方法的说明。

// 1. 
NSDate *firstDate, *secondDate, *thirdDate;

if ([firstDate laterDate:secondDate] == secondDate &&
    [secondDate laterDate:thirdDate] == thirdDate)
{
    /// secondDate is between first and third date.
}

// 2.
if ([secondDate earlierDate:firstDate] == firstDate &&
    [secondDate laterDate:thirdDate] == thirdDate)
{
    /// secondDate is between first and third date.
}
于 2013-10-09T12:31:50.820 回答
0
NSDate *startDate = …;
NSDate *endDate = …;   // make sure endDate is later than startDate
NStimeInterVal endInterval;

[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startDate interval:NULL forDate:startDate];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&endDate interval:&endInterval forDate:endDate];
endDate = [endDate dateByAddingTimeInterval:endInterval-0.001];

这将在默认时区创建时间 0:00 的开始日期和 23:59:59.999 的结束日期

现在使用比较方法

if ([givenDate compare:startDate] == NSOrderedAscending){
     //date is before both dates
} else if ([givenDate compare:endDate] == NSOrderedDescending){
    // date lies after both dates
} else {
 //givenDate lies between both dates.
}

很明显,您想在任何一年检查它。只需将 yer 设置为一年 - 比如 1 - 即可比较所有相关日期。

NSDateComponents *comps = [aCalendar components:(NSUIntegerMax - NSYearCalendarUnit ) fromDate:date];
comps.year = 1;
NSDate *year1Date = [aCalendar dateFromComponents:comps];

NSDate *startDate = …;
NSDate *endDate = …;   // make sure endDate is later than startDate
NStimeInterVal endInterval;

NSDateComponents *comps = [aCalendar components:(NSUIntegerMax - NSYearCalendarUnit ) fromDate:startDate];
comps.year = 1;
NSDate *year1StartDate = [aCalendar dateFromComponents:comps];

comps = [aCalendar components:(NSUIntegerMax - NSYearCalendarUnit ) fromDate:endDate];
comps.year = 1;
NSDate *year1EndDate = [aCalendar dateFromComponents:comps];

comps = [aCalendar components:(NSUIntegerMax - NSYearCalendarUnit ) fromDate:givenDate];
comps.year = 1;
NSDate *year1givenDate = [aCalendar dateFromComponents:comps];


[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&year1StartDate interval:NULL forDate:year1StartDate;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&endDate interval:&endInterval forDate:endDate];
endDate = [endDate dateByAddingTimeInterval:endInterval-0.001];

if ([year1givenDate compare:year1StartDate] == NSOrderedAscending){
     //date is before both dates
} else if ([year1givenDate compare:year1EndDate] == NSOrderedDescending){
    // date lies after both dates
} else {
 //givenDate lies between both dates.
}
于 2013-10-09T12:21:12.243 回答