【问题标题】:How to check if a day lies between two other days in iOS...?如何在iOS中检查一天是否介于另外两天之间......?
【发布时间】:2013-10-09 12:05:47
【问题描述】:

我有一个日期组件,比如生日组件(其中包含月份和日期),我想检查它是否位于其他组件之间。比如说(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 部分。

【问题讨论】:

  • 快速谷歌搜索:compare nsdate without yearthis came up
  • @MarekR:接近但不一样。即没有时间部分。

标签: ios objective-c nsdateformatter nsdatecomponents


【解决方案1】:

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

然后使用 NSDate 的比较方法来查看你的日期是否在两个日期之间。您需要使用两次比较方法。查看compare method's documentation:

  • receiver 和 anotherDate 完全相等,NSOrderedSame
  • 接收者在时间上晚于另一个日期,NSOrderedDescending
  • 接收者在时间上早于另一个日期,NSOrderedAscending。

【讨论】:

  • 这里的问题是它还会比较日期的年份部分..我不想比较,因为我只需要检查生日是否在两个日期之间..
  • 为什么不将它们都设置为当前年份?
  • 谢谢..这就是我最终做的。
【解决方案2】:
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
}

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

【讨论】:

    【解决方案3】:

    非常简单。您可以使用NSDateearlierDate:laterDate: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.
    }
    

    【讨论】:

      【解决方案4】:
      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.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        • 1970-01-01
        • 2017-05-11
        • 1970-01-01
        相关资源
        最近更新 更多