比较 NSDate 时间

Posted

技术标签:

【中文标题】比较 NSDate 时间【英文标题】:Compare NSDate times 【发布时间】:2014-07-16 16:17:48 【问题描述】:

我想比较 if 语句中的两个不同时间。堡垒示例

如果 (10:37 > 09:00) // 做某事

有没有办法使用 NSDate 和 NSDateFormatter 做到这一点?

【问题讨论】:

是的,您可以通过阅读文档来完成,或者,如果您懒得这样做,请使用 Google。 请参阅 ***.com/questions/7370123/… 以获得应该有帮助的答案。 你有两次的格式是什么?他们是时间刺痛吗?完整的NSDate 对象?什么?答案取决于这些信息。 请参考***.com/questions/5388551/how-to-compare-time 【参考方案1】:
NSDate *date1;
NSDate *date2;   
if([date1 laterDate:date2] == *it will return the later date, either date1 or date2*)

【讨论】:

这只有在两个日期恰好在同一天时才有效。 不。我在任何日期都使用它。评论前请告知自己 我的意思是 OP 似乎只想比较两个 NSDate 对象的两个时间部分。如果这两个日期在不同的日期,您的支票将不起作用。实际上它有时会起作用,但并非适用于所有情况。 @rmaddy - OP 并没有真正准确地定义他的问题来说明这是对还是错。【参考方案2】:

试试这个

//Date formatter - to format the sample dates using for comparison
NSDateFormatter *dateformatter = [[NSDateFormatter alloc]init];
[dateformatter setDateFormat:@"HH:MM:SS"];

// Creating 2 sample dates
NSDate *date1 = [dateformatter dateFromString:@"10:10:10"];
NSDate *date2 = [dateformatter dateFromString:@"10:10:20"];

if (NSOrderedDescending == [date1 compare:date2])// Here comparing the dates 

    NSLog(@"date1 later than date 2");

else

    NSLog(@"date2 later than date 1");

【讨论】:

OP 只想检查时间,而不是完整日期。 一个持有时间戳的 NSDate 对象没有?那么如果使用这个有什么问题呢?我使用日期格式创建的 2 个示例 NSDate 对象进行了测试 [dateformatter setDateFormat:@"HH:MM:SS"];它对我很有效。 您的答案应该显示该信息。它不适用于两个任意日期,但如果圆顶如您在评论中描述的那样有效。将该信息放入您的答案中。 更新了答案。请检查。我之前只添加了相关部分 这看起来不错,只是你不应该同时设置日期格式化程序的 dateStyle 和日期格式。我们不知道这是否是 OP 需要的。 OP 没有告诉我们他们实际上必须从什么开始。所以这个答案可能是完美的,也可能完全没用。【参考方案3】:

您需要使用timeIntervalSinceDate api 来比较两个不同的时间。

【讨论】:

这只有在两个日期恰好在同一天时才有效。【参考方案4】:

据我了解,您只有时间,没有日期。实际上,NSDate 并不是最好的选择,因为它恰好代表了永恒中的一个时刻。

如果您只有时间或重复日期,NSDateComponents 是更好的选择。您可以定义所使用的组件,在您的情况下是小时和分钟。

NSDateComponents 有一个警告:没有compare: 方法,但您可以轻松比较

if (date1Comps.hour < date2Comps.hour) 
    NSLog(@"date 1 earlier");
 else if(date1Comps.hour > date2Comps.hour) 
    NSLog(@"date 2 earlier");

 else 
    if (date1Comps.minute < date2Comps.minute) 
        NSLog(@"date 1 earlier");
     else if(date1Comps.minute > date2Comps.minute)
        NSLog(@"date 2 earlier");
     else 
        NSLog(@"same hour, same minute");
    


这里是完整的代码,包括从日期创建组件。

NSString *date1String = @"2014-07-18T10:30";
NSString *date2String = @"2014-07-18T10:45";

NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *date1 = [f dateFromString:date1String];
NSDate *date2 = [f dateFromString:date2String];

NSDateComponents *date1Comps = [[NSCalendar currentCalendar] components:(NSCalendarUnitHour|NSCalendarUnitMinute) fromDate:date1];

NSDateComponents *date2Comps = [[NSCalendar currentCalendar] components:(NSCalendarUnitHour|NSCalendarUnitMinute) fromDate:date2];

if (date1Comps.hour < date2Comps.hour) 
    NSLog(@"date 1 earlier");
 else if(date1Comps.hour > date2Comps.hour) 
    NSLog(@"date 2 earlier");

 else 
    if (date1Comps.minute < date2Comps.minute) 
        NSLog(@"date 1 earlier");
     else if(date1Comps.minute > date2Comps.minute)
        NSLog(@"date 2 earlier");
     else 
        NSLog(@"same hour, same minute");
    

或类似的:在数组中排序日期组件

NSArray *times = [@[date1Comps, date2Comps] sortedArrayUsingComparator:^NSComparisonResult(NSDateComponents *date1Comps, NSDateComponents *date2Comps) 
    if (date1Comps.hour < date2Comps.hour) 
        return NSOrderedAscending;
     else if(date1Comps.hour > date2Comps.hour) 
        return NSOrderedDescending;
     else 
        if (date1Comps.minute < date2Comps.minute) 
            return NSOrderedAscending;
         else if(date1Comps.minute > date2Comps.minute)
            return NSOrderedDescending;
        
    
    return NSOrderedSame;
];

您可以保存此比较块并重复使用它。没有简单的比较方法并不重要。

【讨论】:

【参考方案5】:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:[NSDate date]];
NSInteger todayHour = [components hour];
NSInteger currentMinute = [components minute];
if (currentHour < 7 || (currentHour > 21 || currentHour == 21 && (currentMinute > 0 || currentMinute > 0))) 
// Do your task

这可能对你有帮助:)

【讨论】:

以上是关于比较 NSDate 时间的主要内容,如果未能解决你的问题,请参考以下文章

NSDate 的一些操作(比较创建在现有date加减一定时间等)

NSDate.timeIntervalSinceDate 没有节时调整?

获取时间NSDate

带有 groupBy 的 nspredicate 不喜欢带有 nsdate 的谓词比较

NSDate 比较,找出特定(本地)时区的“午夜数”

如何在 NSArray 中检查 NSDate yyyy/mm/dd 并进行比较?