【问题标题】:How to compare two NSDate objects in objective C如何在目标 C 中比较两个 NSDate 对象
【发布时间】:2011-11-18 13:52:13
【问题描述】:

我有 Date 类型的对象。

我想比较一下,我写了一个if条件如下:

if (([startDate1 isEqualToDate:[self getDefaultDate]]) || (startDate1 != [ self getDefaultDate] && m_selectedDate >= m_currentDate1 && cycleStopped))
 {

///execute some condition

}

我在这种方法中是对还是错?

还有一件事。这样对吗:

if (dtdate > [m_array objectatIndex:i]
{

}

因为我的行为是随机的。

【问题讨论】:

标签: ios nsdate


【解决方案1】:

这是一个使用NSDate 方法的示例,compare:

if([startDate compare: endDate] == NSOrderedDescending) // if start is later in time than end
{
    // do something
}

来自类参考:

如果...

receiver 和 anotherDate 完全相等, NSOrderedSame。

接收者的时间晚于另一个日期,NSOrderedDescending。

接收者在时间上早于另一个日期,NSOrderedAscending。

例如,如果您想比较两个日期并找出它们之间的秒数,也可以使用 timeIntervalSinceDate: 方法。

编辑:

if(([startDate1 compare:[self getDefaultDate]] == NSOrderedSame) || ([startDate1 compare: [self getDefaultDate]] != NSOrderedSame && (([m_selectedDate compare: m_currentDate1] == NSOrderedDescending) || [m_selectedDate compare: m_currentDate1] == NSOrderedSame) && cycleStopped))

【讨论】:

  • 嘿卢克感谢您的信息,但我很困惑..您可以通过转换我的上述条件来显示您的方式..这样它会非常有帮助..谢谢嘿还有一件事。 .无论是早意味着更大还是晚意味着更大
  • @Ranjit NSDates 按时间量工作,因此较大的数字是较晚的日期。这一切都在类参考:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
  • 再次更新以充分考虑到最后一部分;其中 m_selectedDate 可以等于或晚于 m_currentDate1。只需运行它,看看它是如何进行的:)
  • 嘿 Abberant ,我保持时间分量不变
  • 嘿卢克还有一个疑问我有什么条件像这样的 id(dtdate >[m_array objectatIndex:i] 那我该怎么办
【解决方案2】:

比较 NSDates 的简单方法(在此处找到 http://webd.fr/637-comparer-deux-nsdate):

#import <Foundation/Foundation.h>

@interface NSDate (Compare)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
//- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API

@end

以及实现:

#import "NSDate+Compare.h"

@implementation NSDate (Compare)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedAscending);
}

-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedDescending);
}
-(BOOL) isLaterThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedDescending);

}
-(BOOL) isEarlierThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedAscending);
}

@end

使用简单:

if([aDateYouWant ToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now
{
    // do your thing ...
}

享受

【讨论】:

  • 嗨@Pascal,我们可以聊聊吗,我有一些疑问
  • 嗨@Ranjit。给我发一封电子邮件吧。
  • 起初,我把它写下来,因为添加一个类别似乎很麻烦,但在查看了替代品之后......这个得到了我的投票。
【解决方案3】:

我必须承认,我发现“比较”== NSWhatHaveYou 业务太复杂而无法记住(即使它是正确的并且有效)。 NSDate 还有另外两种我的大脑更容易处理的方法:earlierDate 和 laterDate。

考虑一下:

if ([myDate laterDate:today] == myDate) {
    NSLog(@"myDate is LATER than today");
} else {
    NSLog(@"myDate is EARLIER than today");
}

// likewise:
if ([myDate earlierDate:today] == myDate) {
    NSLog(@"myDate is EARLIER than today");
} else {
    NSLog(@"myDate is LATER than today");
}

任何一个方法都返回一个 NSDate 对象,该对象要么早于另一个,要么晚于另一个。

http://pinkstone.co.uk/how-to-compare-two-nsdates/

【讨论】:

  • 感谢您的信息...它真的很容易记住
【解决方案4】:

我真的很喜欢卢克的回答,它就像一个魅力。

我用过这样的东西:

If ([enteredDate compare: [NSDate Date]]== NSOrderedSame || NSOrderedDescending)
{
 //Do Something if the enteredDate is later or the same as today
}else
{
//if the enteredDate is before today's date
}

我不确定这是否有帮助,只是重申一下卢克所写的内容。

【讨论】:

    【解决方案5】:

    这是一种简单的方法,可以检查您认为较早的日期(例如未来)是否大于您认为较早的日期。这就是它的作用。

    1. 获取当前日期和未来日期的时间间隔(秒和小数秒)
    2. 如果您的测试日期大于另一个日期(时间参考),则返回 true

    给你

    - (BOOL)isDateGreaterThanDate:(NSDate*)greaterDate and:(NSDate*)lesserDate{
    
        NSTimeInterval greaterDateInterval = [greaterDate timeIntervalSince1970];
        NSTimeInterval lesserDateInterval = [lesserDate timeIntervalSince1970];
    
        if (greaterDateInterval > lesserDateInterval) 
            return YES;
    
        return NO;
    }
    

    这也有效

    BOOL *isGreaterDateTruelyGreater = [greaterDate timeIntervalSince1970] > [lesserDate timeIntervalSince1970];
    

    objective-c 处理日期的方式不够直观。基本上,您可以使用 NSTimeInterval 从某个时间点获取秒数。它通常给出一个很长的数字,例如当我写这个 1351026414.640865 是从 1970 年开始的时间间隔。

    时间点 > 时间点 1351026415.640865 > 1351026414.640865 以上是提前1秒,所以是真的。

    【讨论】:

      【解决方案6】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多