2013-04-08 67 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