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
4

5 回答 5

3

创建一个时间为 8:10 的 NSDate 对象和一个 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];

如果您坚持使用 and 之类的运算符<>则可以使用日期对象的时间间隔。

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

但要小心检查==它,因为它可能由于舍入错误而出错。

于 2013-04-08T22:55:40.813 回答
1

在这里,您将字符串对象与<and进行比较>,这并不符合您的期望。您可以使用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);

compare:或者,您可以使用 NSDateFormater 并使用该函数为 8:10 和 8:00 创建特定的 NSDate 。

于 2013-04-08T22:39:15.147 回答
0

NSString对象是对象,当您使用 C 比较运算符(==、>、< 等)比较对象时,您是在比较它们的地址,而不是它们的值。您需要使用compare,例如:

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

NSDate尽管如果您想比较日期和时间,我建议在大多数情况下转换为对象。

于 2013-04-08T22:39:06.897 回答
0

您不能使用 > 或 < 来比较字符串对象。这实际上比较了指针,所以我们不会讨论为什么 > “有效”和 < “无效”。

对于这种日期比较,请使用 NSDateComponents NSDateComponents Reference

于 2013-04-08T22:39:22.073 回答
0

这是我在 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
于 2013-04-08T23:27:57.977 回答