2012-11-05 63 views
7

我想比较两天的NSDate对象,我在第一次使用NSDateComponents计算我的两个日期对象之间的差异,但它工作正常。两个NSDate对象之间的天数

NSString *dateStr [email protected]"2012-11-05 15:00:00"; 
    NSDate *date = [dateFormat dateFromString:dateStr]; 
    NSDateComponents *datesDiff = [calendar components: NSDayCalendarUnit 
               fromDate: date 
               toDate: [NSDate date] 
               options: 0]; 

这不能解决我的问题。事实上,当date1 = 2012-11-05 23:00:00和date2 = 2012-11-06 10:00:00时,两个日期之间的差异是0天和11个小时。 我正在寻找一些东西,可以让我检测一天的变化,换句话说,当date1 = 2012-11-05 23:00:00和date2 = 2012-11-06 00:01:00时,有一天差异。

如果有人知道解决方案,我会欢迎他的建议。 在此先感谢

回答

19

我认为你正在寻找这(从Date and Time Programming Guide):

@implementation NSCalendar (MySpecialCalculations) 

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate 
{ 
    NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit 
      inUnit: NSEraCalendarUnit forDate:startDate]; 
    NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit 
      inUnit: NSEraCalendarUnit forDate:endDate]; 
    return endDay-startDay; 
} 
@end 

之间

上市两个日期之间的13天,因为午夜的数量编辑:迅捷版:

extension NSCalendar { 
    func daysWithinEraFromDate(startDate: NSDate, endDate: NSDate) -> Int { 
     let startDay = self.ordinalityOfUnit(.Day, inUnit: NSCalendarUnit.Era, forDate: startDate) 
     let endDay = self.ordinalityOfUnit(.Day, inUnit: NSCalendarUnit.Era, forDate: endDate) 
     return endDay - startDay 
    } 
} 
+0

这正是我想要的,我们要创造一个类别NSCale如文中所述。谢谢 – Ali

6
NSString *start = @"2010-09-01"; 
NSString *end = @"2010-12-01"; 

NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
[f setDateFormat:@"yyyy-MM-dd"]; 
NSDate *startDate = [f dateFromString:start]; 
NSDate *endDate = [f dateFromString:end]; 
[f release]; 

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit 
                fromDate:startDate 
                 toDate:endDate 
                options:0]; 
[gregorianCalendar release]; 

组件现在保持不同。

NSLog(@"%ld", [components day]); 
0
func daysBetweenDates(startDate: NSDate, endDate: NSDate) -> Int 
{ 
    let calendar = NSCalendar.currentCalendar() 

    let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: []) 

    return components.day 
} 

let calendar = NSCalendar.currentCalendar(); 
let component1 = calendar.component(.Day, fromDate: fromDate) 
let component2 = calendar.component(.Day, fromDate: toDate) 
let difference = component1 - component2 
0

对于斯威夫特3:

从@马萨的回答扩展:

extension Calendar { 
    func daysWithinEraFromDate(startDate: Date, endDate: Date) -> Int? { 
     guard let startDay = ordinality(of: .day, in: .era, for: startDate) else { 
      return nil 
     } 

     guard let endDay = ordinality(of: .day, in: .era, for: endDate) else { 
      return nil 
     } 

     return endDay - startDay 
    } 
}