简体   繁体   English

如何比较两个NSDates:哪个更近?

[英]How to compare two NSDates: Which is more recent?

I am trying to achieve a dropBox sync and need to compare the dates of two files. 我正在尝试实现dropBox同步,需要比较两个文件的日期。 One is on my dropBox account and one is on my iPhone. 一个在我的dropBox帐户上,一个在我的iPhone上。

I came up with the following, but I get unexpected results. 我想出了以下内容,但我得到了意想不到的结果。 I guess I'm doing something fundamentally wrong when comparing the two dates. 我想在比较这两个日期时我做了一些根本错误的事情。 I simply used the > < operators, but I guess this is no good as I am comparing two NSDate strings. 我只是使用了> <运算符,但我想这并不好,因为我正在比较两个NSDate字符串。 Here we go: 开始了:

NSLog(@"dB...lastModified: %@", dbObject.lastModifiedDate); 
NSLog(@"iP...lastModified: %@", [self getDateOfLocalFile:@"NoteBook.txt"]);

if ([dbObject lastModifiedDate] < [self getDateOfLocalFile:@"NoteBook.txt"]) {
    NSLog(@"...db is more up-to-date. Download in progress...");
    [self DBdownload:@"NoteBook.txt"];
    NSLog(@"Download complete.");
} else {
    NSLog(@"...iP is more up-to-date. Upload in progress...");
    [self DBupload:@"NoteBook.txt"];
    NSLog(@"Upload complete.");
}

This gave me the following (random & wrong) output: 这给了我以下(随机和错误)输出:

2011-05-11 14:20:54.413 NotePage[6918:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:54.414 NotePage[6918:207] iP...lastModified: 2011-05-11 13:20:48 +0000
2011-05-11 14:20:54.415 NotePage[6918:207] ...db is more up-to-date.

or this one which happens to be correct: 或者这个恰好是正确的:

2011-05-11 14:20:25.097 NotePage[6903:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:25.098 NotePage[6903:207] iP...lastModified: 2011-05-11 13:19:45 +0000
2011-05-11 14:20:25.099 NotePage[6903:207] ...iP is more up-to-date.

Let's assume two dates: 我们假设两个日期:

NSDate *date1;
NSDate *date2;

Then the following comparison will tell which is earlier/later/same: 然后以下比较将告诉哪个是早/晚/相同:

if ([date1 compare:date2] == NSOrderedDescending) {
    NSLog(@"date1 is later than date2");
} else if ([date1 compare:date2] == NSOrderedAscending) {
    NSLog(@"date1 is earlier than date2");
} else {
    NSLog(@"dates are the same");
}

Please refer to the NSDate class documentation for more details. 有关更多详细信息,请参阅NSDate类文档

Late to the party, but another easy way of comparing NSDate objects is to convert them into primitive types which allows for easy use of '>' '<' '==' etc 在派对之后,另一种比较NSDate对象的简单方法是将它们转换为原始类型,以便于使用'>'''''=='等

eg. 例如。

if ([dateA timeIntervalSinceReferenceDate] > [dateB timeIntervalSinceReferenceDate]) {
    //do stuff
}

timeIntervalSinceReferenceDate converts the date into seconds since the reference date (1 January 2001, GMT). timeIntervalSinceReferenceDate将日期转换为自参考日期(2001年1月1日,GMT)以来的秒数。 As timeIntervalSinceReferenceDate returns a NSTimeInterval (which is a double typedef), we can use primitive comparators. timeIntervalSinceReferenceDate返回NSTimeInterval(它是一个double typedef)时,我们可以使用原始比较器。

In Swift, you can overload existing operators: 在Swift中,您可以重载现有的运算符:

func > (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate > rhs.timeIntervalSinceReferenceDate
}

func < (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate < rhs.timeIntervalSinceReferenceDate
}

Then, you can compare NSDates directly with < , > , and == (already supported). 然后,您可以直接将NSDates与<>== (已经支持)进行比较。

NSDate has a compare function. NSDate具有比较功能。

compare: Returns an NSComparisonResult value that indicates the temporal ordering of the receiver and another given date. compare:返回NSComparisonResult值,该值指示接收方的时间顺序和另一个给定日期。

(NSComparisonResult)compare:(NSDate *)anotherDate

Parameters : anotherDate The date with which to compare the receiver. 参数anotherDate比较接收器的日期。 This value must not be nil. 该值不得为零。 If the value is nil, the behavior is undefined and may change in future versions of Mac OS X. 如果值为nil,则行为未定义,并且可能在将来的Mac OS X版本中更改。

Return Value: 返回值:

  • If the receiver and anotherDate are exactly equal to each other, NSOrderedSame 如果接收者和anotherDate彼此完全相同, NSOrderedSame
  • If the receiver is later in time than anotherDate, NSOrderedDescending 如果接收者的时间晚于anotherDate, NSOrderedDescending
  • If the receiver is earlier in time than anotherDate, NSOrderedAscending . 如果接收者的时间早于anotherDate,则NSOrderedAscending

You want to use the NSDate compare:, laterDate:, earlierDate:, or isEqualToDate: methods. 您想使用NSDate compare:,laterDate:,earlyDate:或isEqualToDate:methods。 Using the < and > operators in this situation is comparing the pointers, not the dates 在这种情况下使用<和>运算符是比较指针,而不是日期

- (NSDate *)earlierDate:(NSDate *)anotherDate

This returns the earlier of the receiver and anotherDate. 这将返回接收器和anotherDate的早期版本。 If both are same, the receiver is returned. 如果两者相同,则返回接收器。

Some date utilities, including comparisons IN ENGLISH, which is nice: 一些日期工具,包括比较IN ENGLISH,这很好:

#import <Foundation/Foundation.h>


@interface NSDate (Util)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
- (NSDate*) dateByAddingDays:(int)days;

@end

The implementation: 实施:

#import "NSDate+Util.h"


@implementation NSDate (Util)

-(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);
}

- (NSDate *) dateByAddingDays:(int)days {
    NSDate *retVal;
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:days];

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    retVal = [gregorian dateByAddingComponents:components toDate:self options:0];
    return retVal;
}

@end

Why don't you guys use these NSDate compare methods: 你们为什么不使用这些NSDate比较方法:

- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;

You should use : 你应该使用:

- (NSComparisonResult)compare:(NSDate *)anotherDate

to compare dates. 比较日期。 There is no operator overloading in objective C. 目标C中没有运算符重载。

I have encounter almost same situation, but in my case I'm checking if number of days difference 我遇到了几乎相同的情况,但在我的情况下,我正在检查是否有天数差异

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *compDate = [cal components:NSDayCalendarUnit fromDate:fDate toDate:tDate options:0];
int numbersOfDaysDiff = [compDate day]+1; // do what ever comparison logic with this int.

Useful when you need to compare NSDate in Days/Month/Year unit 当您需要比较天/月/年单位的NSDate时很有用

You can compare two date by this method also 您也可以通过此方法比较两个日期

        switch ([currenttimestr  compare:endtimestr])
        {
            case NSOrderedAscending:

                // dateOne is earlier in time than dateTwo
                break;

            case NSOrderedSame:

                // The dates are the same
                break;
            case NSOrderedDescending:

                // dateOne is later in time than dateTwo


                break;

        }

I have tried it hope it works for you 我试过它希望它适合你

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];      
int unitFlags =NSDayCalendarUnit;      
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];     
NSDate *myDate; //= [[NSDate alloc] init];     
[dateFormatter setDateFormat:@"dd-MM-yyyy"];   
myDate = [dateFormatter dateFromString:self.strPrevioisDate];     
NSDateComponents *comps = [gregorian components:unitFlags fromDate:myDate toDate:[NSDate date] options:0];   
NSInteger day=[comps day];

Use this simple function for date comparison 使用此简单功能进行日期比较

-(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{

BOOL isTokonValid;

if ([date1 compare:date2] == NSOrderedDescending) {
    NSLog(@"date1 is later than date2");
    isTokonValid = YES;
} else if ([date1 compare:date2] == NSOrderedAscending) {
    NSLog(@"date1 is earlier than date2");
    isTokonValid = NO;
} else {
    isTokonValid = NO;
    NSLog(@"dates are the same");
}

return isTokonValid;}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM