【问题标题】:How to compare two dates in Objective-C如何在 Objective-C 中比较两个日期
【发布时间】:2010-11-02 22:49:28
【问题描述】:

我有两个日期:2009-05-11 和当前日期。我想检查给定日期是否是当前日期。这怎么可能。

【问题讨论】:

  • 查看答案,不清楚您是想从字面上比较两个 NSDate 实例的相等性(同一时间点)还是想知道它们是否在同一日历日。

标签: objective-c cocoa date date-comparison


【解决方案1】:

你真正需要的是比较两个同类的对象。

  1. 根据您的字符串日期 (@"2009-05-11") 创建一个 NSDate:
    http://blog.evandavey.com/2008/12/how-to-convert-a-string-to-nsdate.html

  2. 如果当前日期也是字符串,则将其设为 NSDate。如果它已经是 NSDate,请留下它。

【讨论】:

  • 你不能比较两个对象,使用 ==
  • 我的错误,同时回答了另一个问题。感谢您对此发表评论。
【解决方案2】:

..

NSString *date = @"2009-05-11"
NSString *nowDate = [[[NSDate date]description]substringToIndex: 10];
if([date isEqualToString: nowDate])
{
// your code
}

【讨论】:

  • 我认为将“日期”转换为 NSDate 对象然后比较 NSDate 对象会更有用。这段代码可以工作,但 substringToIndex:10 确实是一个 hack。如果您需要更多信息,例如哪个日期更近 - 您也需要这样做。
  • 当然可以比较NSDate对象。但是 NSDate 有关于日期和时间的信息 您需要 1. 从字符串创建 NSDate 2. 从有关时间的当前日期信息中删除(将时间设置为 00:00:00)并且仅在比较日期之后。我认为这种方式并不简单快捷。
  • 如果您只对当天感兴趣,您可以创建 NSDates 然后使用 NSCalendar 从中获取 NSDateComponents,此时您可以仅对您感兴趣的值进行数值比较。您还可以获取自纪元以来天数的组件,以用于单个比较。
  • 您不应该通过子串化 NSDate 描述来进行比较,因为 Apple 可以更改格式,然后这将不再起作用。我之所以这么说,是因为这与我的应用在新的操作系统更新时开始崩溃的原因相同。
【解决方案3】:

【讨论】:

    【解决方案4】:

    如果您将两个日期都设为NSDates,您可以使用NSDatecompare: 方法:

    NSComparisonResult result = [Date2 compare:Date1];
    
    if(result==NSOrderedAscending)
        NSLog(@"Date1 is in the future");
    else if(result==NSOrderedDescending)
        NSLog(@"Date1 is in the past");
    else
        NSLog(@"Both dates are the same");
    

    您可以查看文档here

    【讨论】:

      【解决方案5】:

      Cocoa has couple of methods for this:

      在 NSDate 中

      – isEqualToDate:  
      – earlierDate:  
      – laterDate:  
      – compare:
      

      当您使用 - (NSComparisonResult)compare:(NSDate *)anotherDate 时,您会返回其中之一:

      The receiver and anotherDate are exactly equal to each other, NSOrderedSame
      The receiver is later in time than anotherDate, NSOrderedDescending
      The receiver is earlier in time than anotherDate, NSOrderedAscending.
      

      示例:

      NSDate * now = [NSDate date];
      NSDate * mile = [[NSDate alloc] initWithString:@"2001-03-24 10:45:32 +0600"];
      NSComparisonResult result = [now compare:mile];
      
      NSLog(@"%@", now);
      NSLog(@"%@", mile);
      
      switch (result)
      {
          case NSOrderedAscending: NSLog(@"%@ is in future from %@", mile, now); break;
          case NSOrderedDescending: NSLog(@"%@ is in past from %@", mile, now); break;
          case NSOrderedSame: NSLog(@"%@ is the same as %@", mile, now); break;
          default: NSLog(@"erorr dates %@, %@", mile, now); break;
      }
      
      [mile release];
      

      【讨论】:

      • 这如何回答“给定日期是否为当前日期”的原始问题? [NSDate date] 将 NSOrderedSame 到任何固定日期,不是 24 小时,而是不到一秒。
      • 这不适用于 iOS。查看接受的答案:stackoverflow.com/questions/14702626/…
      • @HappyFlow 问题被标记为cocoa 它没有提到iOS,有关更多信息,请尝试谷歌“cocoa”与“cocoa touch”
      • @stefanB 糟糕,我没看到。
      • @AlexanderofNorway 根据 Apple 文档,自 iOS2.0 以来,这确实适用于 iOS:developer.apple.com/library/ios/documentation/Cocoa/Reference/…:
      【解决方案6】:

      来了,伙计。此功能会将您的日期与任何特定日期匹配,并且能够判断它们是否匹配。您还可以修改组件以满足您的要求。

      - (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 {
      NSCalendar* calendar = [NSCalendar currentCalendar];
      
      unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
      NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
      NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];
      
      return [comp1 day]   == [comp2 day] &&
      [comp1 month] == [comp2 month] &&
      [comp1 year]  == [comp2 year];}
      

      问候, 小屁屁

      【讨论】:

      • 这是正确答案。虽然最佳答案可能更笼统,但这提供了针对所提出问题的特定解决方案。
      • 简直完美!!尝试了几种方法,这很方便
      • @Naveed Rafi 这是我在享受 StackOverflow 服务的 2 年里看到的最准确和最有用的答案。
      【解决方案7】:
      NSDate *today = [NSDate date]; // it will give you current date
      NSDate *newDate = [NSDate dateWithString:@"xxxxxx"]; // your date 
      
      NSComparisonResult result; 
      //has three possible values: NSOrderedSame,NSOrderedDescending, NSOrderedAscending
      
      result = [today compare:newDate]; // comparing two dates
      
      if(result==NSOrderedAscending)
          NSLog(@"today is less");
      else if(result==NSOrderedDescending)
          NSLog(@"newDate is less");
      else
          NSLog(@"Both dates are same");
      

      还有其他方法可以用来比较 NSDate 对象。每个 方法在某些任务上会更有效。我选择了比较方法 因为它将处理您的大部分基本日期比较需求。

      【讨论】:

        【解决方案8】:
        NSDateFormatter *df= [[NSDateFormatter alloc] init];
        
        [df setDateFormat:@"yyyy-MM-dd"];
        
        NSDate *dt1 = [[NSDate alloc] init];
        
        NSDate *dt2 = [[NSDate alloc] init];
        
        dt1=[df dateFromString:@"2011-02-25"];
        
        dt2=[df dateFromString:@"2011-03-25"];
        
        NSComparisonResult result = [dt1 compare:dt2];
        
        switch (result)
        {
        
                case NSOrderedAscending: NSLog(@"%@ is greater than %@", dt2, dt1); break;
        
                case NSOrderedDescending: NSLog(@"%@ is less %@", dt2, dt1); break;
        
                case NSOrderedSame: NSLog(@"%@ is equal to %@", dt2, dt1); break;
        
                default: NSLog(@"erorr dates %@, %@", dt2, dt1); break;
        
        }
        

        享受编码......

        【讨论】:

          【解决方案9】:

          我发现最好的方法是检查给定日期和今天之间的差异:

          NSCalendar* calendar = [NSCalendar currentCalendar];
          NSDate* now = [NSDate date];
          int differenceInDays =
          [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:date] -
          [calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:now];
          

          根据 Apple 的 Date and Time Programming GuideCalendrical Calculations 的清单 13 [NSCalendar ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:myDate] 为您提供了自时代开始以来的午夜数。 这样可以很容易地检查日期是昨天、今天还是明天。

          switch (differenceInDays) {
              case -1:
                  dayString = @"Yesterday";
                  break;
              case 0:
                  dayString = @"Today";
                  break;
              case 1:
                  dayString = @"Tomorrow";
                  break;
              default: {
                  NSDateFormatter* dayFormatter = [[NSDateFormatter alloc] init];
                  [dayFormatter setLocale:usLocale];
                  [dayFormatter setDateFormat:@"dd MMM"];
                  dayString = [dayFormatter stringFromDate: date];
                  break;
              }
          }
          

          【讨论】:

            【解决方案10】:

            This 类别提供了一种比较 NSDates 的简洁方法:

            #import <Foundation/Foundation.h>
            
            @interface NSDate (Compare)
            
            -(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
            -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
            -(BOOL) isLaterThan:(NSDate*)date;
            -(BOOL) isEarlierThan:(NSDate*)date;
            //- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API
            
            @end
            

            以及实现:

            #import "NSDate+Compare.h"
            
            @implementation NSDate (Compare)
            
            -(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
                return !([self compare:date] == NSOrderedAscending);
            }
            
            -(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
                return !([self compare:date] == NSOrderedDescending);
            }
            -(BOOL) isLaterThan:(NSDate*)date {
                return ([self compare:date] == NSOrderedDescending);
            
            }
            -(BOOL) isEarlierThan:(NSDate*)date {
                return ([self compare:date] == NSOrderedAscending);
            }
            
            @end
            

            使用简单:

            if([aDateYouWantToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now
            {
                // do your thing ...
            }
            

            【讨论】:

            • 谢谢!这比直接在其中包含带有 NSComparisonResults 的代码(日期难以理解)要好得多。
            • Apple 应该考虑实现这一点。比为早于或等于和晚于或等于创建 switch 语句要容易得多。
            【解决方案11】:

            通过这种方法你也可以比较两个日期

            NSDate * dateOne = [NSDate date];
            NSDate * dateTwo = [NSDate date];
            
            if([dateOne compare:dateTwo] == NSOrderedAscending)
            {
            
            }
            

            【讨论】:

            • 比较有趣的常量可能是:NSOrderedAscendingNSOrderedSameNSOrderedDescending,但 OP 可能需要 NSOrderedSame 来解决他的特殊问题。
            【解决方案12】:

            这是 Pascal 答案的 Swift 变体:

            extension NSDate {
            
                func isLaterThanOrEqualTo(date:NSDate) -> Bool {
                    return !(self.compare(date) == NSComparisonResult.OrderedAscending)
                }
            
                func isEarlierThanOrEqualTo(date:NSDate) -> Bool {
                    return !(self.compare(date) == NSComparisonResult.OrderedDescending)
                }
            
                func isLaterThan(date:NSDate) -> Bool {
                    return (self.compare(date) == NSComparisonResult.OrderedDescending)
                }
            
                func isEarlierThan(date:NSDate) -> Bool {
                    return (self.compare(date) == NSComparisonResult.OrderedAscending)
                }
            }
            

            可以用作:

            self.expireDate.isEarlierThanOrEqualTo(NSDate())
            

            【讨论】:

              【解决方案13】:

              如果其他人正在寻找它,这是 Naveed Rafi 的答案转换为 Swift 的函数:

              func isSameDate(#date1: NSDate, date2: NSDate) -> Bool {
                  let calendar = NSCalendar()
                  let date1comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date1)
                  let date2comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date2)
                  return (date1comp.year == date2comp.year) && (date1comp.month == date2comp.month) && (date1comp.day == date2comp.day)
              }
              

              【讨论】:

                【解决方案14】:
                Get Today's Date:
                
                NSDate* date = [NSDate date];
                
                Create a Date From Scratch:    
                NSDateComponents* comps = [[NSDateComponents alloc]init];
                comps.year = 2015;
                comps.month = 12;
                comps.day = 31;
                NSCalendar* calendar = [NSCalendar currentCalendar];
                NSDate* date = [calendar dateFromComponents:comps];
                
                
                Add a day to a Date:  
                NSDate* date = [NSDate date];
                NSDateComponents* comps = [[NSDateComponents alloc]init];
                comps.day = 1;
                NSCalendar* calendar = [NSCalendar currentCalendar];
                NSDate* tomorrow = [calendar dateByAddingComponents:comps toDate:date options:nil];
                
                
                Subtract a day from a Date:    
                NSDate* date = [NSDate date];
                NSDateComponents* comps = [[NSDateComponents alloc]init];
                comps.day = -1;
                NSCalendar* calendar = [NSCalendar currentCalendar];
                NSDate* yesterday = [calendar dateByAddingComponents:comps toDate:date options:nil];
                
                
                
                Convert a Date to a String:  
                
                NSDate* date = [NSDate date];
                NSDateFormatter* formatter = [[NSDateFormatter alloc]init];
                formatter.dateFormat = @"MMMM dd, yyyy";
                NSString* dateString = [formatter stringFromDate:date];
                
                
                Convert a String to a Date:
                
                NSDateFormatter* formatter = [[NSDateFormatter alloc]init];
                formatter.dateFormat = @"MMMM dd, yyyy";
                NSDate* date = [formatter dateFromString:@"August 02, 2014"];
                
                
                Find how many days are in a month:    
                NSDate* date = [NSDate date];
                NSCalendar* cal = [NSCalendar currentCalendar];
                NSRange currentRange = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
                NSInteger numberOfDays = currentRange.length;
                
                
                Calculate how much time something took:   
                
                NSDate* start = [NSDate date];
                for(int i = 0; i < 1000000000; i++);
                NSDate* end = [NSDate date];
                NSTimeInterval duration = [end timeIntervalSinceDate:start];
                
                
                Find the Day Of Week for a specific Date:
                
                NSDate* date = [NSDate date];
                NSCalendar* cal = [NSCalendar currentCalendar];
                NSInteger dow = [cal ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
                

                然后使用 NSComparisonResult 比较日期。

                【讨论】:

                  猜你喜欢
                  • 2010-12-14
                  • 2013-06-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-08-06
                  相关资源
                  最近更新 更多