2011-06-06 39 views
3

我想比較的日期,我用這個代碼IOS:與NSOrderedDescending和NSOrderedAscending

在一個例子日期值我的日期問題是: 日期1 = 2011年6月6日 日期2 = 2011年8月6日

if dateSelected = 7/06/2011一切正常,但如果dateSelected = 6/06/2011或dateSelected = 8/06/2011代碼不會進入我的「如果」內,爲什麼?

if (([dateSelected compare:date1] == NSOrderedDescending) && 
       ([dateSelected compare:date2]== NSOrderedAscending)) 
      {} 

回答

3

NSDates代表一個時間點,因爲1/1/2000 00:00 UTC。所以所有這些日期都有時間組件。 -compare:比較日期和時間。

大概,你真的想檢查選擇的日期是在6/6/2011 00:00和9/6/2011 00:00之間。此外,您可能希望2011年6月6日00:00的日期計算在該範圍內。所以,你需要像

NSComparisonResult compareStart = [date1 compare: selectedDate]; // date1 is 6/6/2011 00:00 
NSComparisonResult compareEnd = [date2 compare: selectedDate]; // date2 is 9/6/2011 00:00 

if ((compareStart == NSOrderedAscending) || (compareStart == NSOrderedSame) 
    && (compareEnd == NSOrderedDescending)) 
{ 
    // date is in the right range 
} 
+0

我有過這樣的警告:「不兼容的指針類型將NSDate發送給類型爲NSNumber的參數」 – CrazyDev 2011-06-06 08:23:31

+0

@blackguardian:如果您試圖將數字與數字進行比較,那麼只會得到該結果。你如何設置date1,date2和選定的日期? – JeremyP 2011-06-06 08:25:19

+0

在控制檯中的結果是: 2011-06-06 10:31:48.423 Project [173:707] date1:​​2011-06-06 08:30:57 +0000 2011-06-06 10:31:48.429項目[173:707] date2:2011-06-08 00:00:00 +0000 2011-06-06 10:31:48.432 Project [173:707] dateSelected:2011-06-07 08:30:37 + 0000 – CrazyDev 2011-06-06 08:31:40

0

試試這個:

if (([date1 compare:dateSelected] == NSOrderedAscending) && 
       ([date2 compare:dateSelected]== NSOrderedDescending)) 
      {} 
+0

不是我有一個警告「兼容的指針類型發送的NSDate類型爲NSNumber的參數」 – CrazyDev 2011-06-06 08:17:09

+0

我試圖採取之間的差異優勢[一個比較:B]與[B比較:a]照顧你對範圍的要求,包括界限......但我認爲JeremyP的答案無論如何都是更好的答案。 – Steve 2011-06-06 08:20:29

0

對於那些誰比@blackguardian同樣的問題:

Cannot initialize a parameter of type 'NSNumber *' with an lvalue of type 'NSDate *' 


在這樣的事情:

NSDate* oldDate = [NSDate date]; 
BOOL older = ([[NSDate date] compare:oldDate] == NSOrderedDescending); 


我不知道爲什麼,但是您需要將「[NSDate date]」轉換爲「NSDate *」。 這是工作:

NSDate* oldDate = [NSDate date]; 
BOOL older = ([[(NSDate*)[NSDate date] compare:oldDate] == NSOrderedDescending);