2013-04-08 101 views
0

我想要做的是使日期使用大於小於符號的if語句。出於某種原因,只有大於號的作品。這裏是我的代碼:如果聲明的日期

NSDate *currDate = [NSDate date]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
[dateFormatter setDateFormat:@"HHmm"]; 
NSString *dateString = [dateFormatter stringFromDate:currDate]; 
NSLog(@"%@",dateString); 

if (dateString < @"0810" && dateString > @"0800") { 
    NSLog(@"Homeroom"); 
} 
else { 
    NSLog(@"no"); 
} 

此代碼的輸出是,如果時間爲8:03:

2013-04-08 08:03:47.956 Schedule2.0[13200:c07] 0803 
2013-04-08 08:03:47.957 Schedule2.0[13200:c07] no 

如果我要提出的是這樣的地方只有再簽收,如更大這樣的:

if (dateString > @"0800") { 
    NSLog(@"Homeroom"); 
} 
else { 
    NSLog(@"no"); 
} 

輸出會是這樣:

2013-04-08 08:03:29.748 Schedule2.0[14994:c07] 0803 
2013-04-08 08:03:29.749 Schedule2.0[14994:c07] Homeroom 

回答

3

創建的NSDate對象與時間8:10和一個帶8:00。現在,您可以用這兩個日期比較給定日期

if(([date0800 compare:date] == NSOrderingAscending) && [date0810 compare:date] == NSOrderingDescending)) 
{ 
    // date is between the other 
} 

創建邊界日期,如果你堅持使用運營商的類似<>你可以做到這一點

NSDate *date = [NSDate date]; // now 
NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date]; 
components.hour = 8; 
components.minute = 0; 

NSDate *date0800 = [[NSCalendar currentCalendar] dateFromComponents: components]; 
components.minute = 10; 
NSDate *date0810 = [[NSCalendar currentCalendar] dateFromComponents: components]; 

,您可以使用日期對象的時間間隔。

if(([date0800 timeIntervalSince1970] < [date timeIntervalSince1970]) && ([date0810 timeIntervalSince1970] > [date timeIntervalSince1970])) 
{ 
    // date lays between the other two 
} 

但要注意檢查就可以了==,因爲它可能是錯誤的,由於舍入誤差。

+0

你可以舉一個NSDate對象的例子,對不起我對客觀的C ... – user2259486 2013-04-08 22:58:49

+0

請看我的編輯。並檢查日期和日曆主題的蘋果文檔:執行日曆計算不是微不足道的 – vikingosegundo 2013-04-08 23:03:11

+0

我修復了一些錯別字 – vikingosegundo 2013-04-08 23:04:39

0

NSString對象是對象,並且當與C比較操作符(==,>,<等)你是比較它們的地址,而不是它們的值進行比較的對象。您需要使用compare,如:

if ([dateString compare:@"0810"] == NSOrderedAscending && 
    [dateString compare:@"0800"] == NSOrderedDescending) { ... 

雖然我如果要比較的日期和時間會建議轉換爲NSDate對象在大多數情況下。

+0

這個工作非常非常感謝你這個完美!但是,你的意思是轉換爲NSDate? – user2259486 2013-04-08 22:54:55

+0

見https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtDates.html和https://developer.apple.com/library/mac/#documentation/Cocoa/概念/ DataFormatting /用品/ dfDateFormatting10_4.html。 NSDate,NSDateComponents和NSDateFormatter是用於管理日期和時間計算和顯示的內置類型。但很高興你的琴絃正在工作。 – 2013-04-09 02:09:36

1

在這裏,你比較字符串對象,<>,這不符合你的期望。您可以使用NSDateComponents得到的小時和分鐘來比較這些:

NSDate *today = [NSDate date]; 

NSCalendar *gregorian = [[NSCalendar alloc] 

        initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *components = 

       [gregorian components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:today]; 

NSInteger hour = [weekdayComponents hour]; 

NSInteger minutes = [weekdayComponents minute]; 

BOOL homeroom = (hour == 8) && (minute < 10); 

也可以爲8:10和8:00使用NSDateFormater和使用compare:函數創建一個特定的NSDate。

0

不能使用>或<比較字符串對象。這實際上是比較指針,所以我們不會理解爲什麼>'作品',而<'不'。

對於這種類型的日期比較使用NSDateComponents的 NSDateComponents Reference

0

這裏有一個I類上的NSDate寫的要點。我發現它使我的代碼更具可讀性。

https://gist.github.com/nall/5341477

@interface NSDate(SZRelationalOperators) 
-(BOOL)isLessThan:(NSDate*)theDate; 
-(BOOL)isLessThanOrEqualTo:(NSDate*)theDate; 
-(BOOL)isGreaterThan:(NSDate*)theDate; 
-(BOOL)isGreaterThanOrEqualTo:(NSDate*)theDate; 
@end