2012-10-23 70 views
1

我讀過的所有問題,並回答所有關於這個主題的教程,但由於某些原因,它不是爲我工作。總是告訴我這兩個日期是同一日期!NSDate的比較都不盡如人意

請有人幫我指點迷津,我只是想檢查是否一個比另一個大(包括日期和時間 - 無需秒),或者如果他們是平等的。

這是我的代碼:

- (BOOL)isEndDateIsBiggerThanCurrectDate:(NSDate *)checkEndDate 
{ 
    NSString *endd = [NSDateFormatter localizedStringFromDate:checkEndDate 
                 dateStyle:NSDateFormatterShortStyle 
                 timeStyle:NSDateFormatterShortStyle]; 

    NSString *curreeeent = [NSDateFormatter localizedStringFromDate:[NSDate date] 
                 dateStyle:NSDateFormatterShortStyle 
                 timeStyle:NSDateFormatterShortStyle]; 

    NSDateFormatter * df = [[NSDateFormatter alloc]init];; 

    NSDate * newCurrent = [df dateFromString:endd]; 
    NSDate * newEnd = [df dateFromString:curreeeent]; 

    switch ([newCurrent compare:newEnd]) 
    { 
     case NSOrderedAscending: 
      return YES; 
      break; 
     case NSOrderedSame: 
      return NO; 
      break; 
     case NSOrderedDescending: 
      return NO; 
      break; 
    } 
} 

非常感謝您!

+0

爲什麼你從日期創建字符串然後回到日期? – rckoenes

+0

因爲我想要沒有秒的日期,只有HH:mm。所以我使用短日期格式。 –

+0

不需要使用日期格式化程序。請參閱下面的答案。 – Ilanchezhian

回答

0

我已經得到了答案,只是檢查兩個日期和比較它的確切時間。

- (BOOL)isEndDateIsSmallerThanCurrent:(NSDate *)checkEndDate 
{ 
    NSDate* enddate = checkEndDate; 
    NSDate* currentdate = [NSDate date]; 
    NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate]; 
    double secondsInMinute = 60; 
    NSInteger secondsBetweenDates = distanceBetweenDates/secondsInMinute; 

    if (secondsBetweenDates == 0) 
     return YES; 
    else if (secondsBetweenDates < 0) 
     return YES; 
    else 
     return NO; 
} 
-2

你爲什麼不更改日期,時間間隔自1970年以來和排序通過。極其簡單的數字比較,更快不是字符串進行比較,他們將永遠排序正確的,不喜歡1,10,11,2,21,22,3,....

NSDate *now = [NSDate date]; 
NSTimeInterval ti = [now timeIntervalSince1970]; 

完蛋了。沒有新的對象創建,在CPU上更快,更少的徵稅。

這裏看你如何擺脫秒,但它很容易,因爲你有一個數字,幾秒鐘。看到這裏How to set seconds to zero for NSDate

+1

'NSTimeInterval'是**不是**整數,而是**。 – JustSid

+0

NSTimeInterval會用秒和毫秒,而這個問題是關於貝因在同一分鐘 – Mark

+0

等於取決於你如何創建日期,秒和毫秒可以爲零。如果您爲前例創建日期。 23-12-2012 12:00,你沒有多餘的秒或毫秒 –

0

你確實應該使用的時間間隔,而不是日期和字符串之間的轉換。

類似下面應該滿足您的需求:

//current time 
NSDate *now = [NSDate date]; 

//time in the future 
NSDate *distantFuture = [NSDate distantFuture]; 

//gather time interval 
if([now timeIntervalSinceDate:distantFuture] > 0) 
{ 
    //huzzah! 
} 
+0

如果我有日期23/10/12 11:32我希望它與當前日期進行比較,是timeIntervalSinceDate這樣做?沒有秒?只有幾小時幾分鐘? –

+0

timeIntervalSinceDate也會考慮秒。 – CaptainRedmuff

+0

將日期中的秒數設置爲0(零) –

1

爲此,您必須使用NSCalender

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSInteger desiredComponents = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit); 


NSDateComponents *firstComponents = [calendar components:desiredComponents fromDate:[NSDate date]]; 
NSDateComponents *secondComponents = [calendar components:desiredComponents fromDate: checkEndDate]; 

NSDate *first = [calendar dateFromComponents:firstComponents]; 
NSDate *second = [calendar dateFromComponents:secondComponents]; 

NSComparisonResult result = [first compare:second]; 
if (result == NSOrderedAscending) { 
    //checkEndDate is before now 
} else if (result == NSOrderedDescending) { 
    //checkEndDate is after now 
} else { 
    //both are same 
}