iOS: So sánh hai ngày


96

Tôi có một NSDatemà tôi phải so sánh với hai ngày khác NSDatevà tôi cố gắng với NSOrderAscendingNSOrderDescendingnhưng nếu ngày của tôi bằng nhau vào hai ngày khác?

Ví dụ: nếu tôi có một myDate = 24/05/2011 và hai cái khác là một = 24/05/2011và hai, 24/05/2011tôi có thể sử dụng gì?


1
Tôi không hoàn toàn hiểu câu hỏi của bạn, bạn đang cố gắng đạt được điều gì?
sáng

ngày một và ngày hai có thể là một = 15/05/2011 và hai = 31/05/2011 nhưng chúng cũng phải cùng ngày một = 24/05/2011 và hai = 24/05/2011 thì tôi phải kiểm tra xem myData nằm giữa ngày thứ nhất và ngày thứ hai
cycleIsBetter

Chỉ cần trích xuất năm, tháng và ngày và so sánh chúng theo thứ tự đó. Nếu có hòa thì hãy so sánh trường tiếp theo.
Himadri Choudhury

Câu trả lời:


210

Theo tài liệu của Apple vềNSDate compare:

Trả về giá trị NSComparisonResult cho biết thứ tự thời gian của người nhận và một ngày cụ thể khác.

- (NSComparisonResult)compare:(NSDate *)anotherDate

Thông số anotherDate

Ngày để so sánh người nhận. Giá trị này không được bằng 0. Nếu giá trị bằng 0, hành vi này là không xác định và có thể thay đổi trong các phiên bản Mac OS X.

Giá trị trả lại

Nếu:

Người nhận và Ngày khác hoàn toàn bằng nhau, NSOrderedSame

Người nhận muộn hơn thời gian khác Ngày, NSOrderedDescending

Người nhận sớm hơn thời gian khác Ngày, NSOrderedAscending

Nói cách khác:

if ([date1 compare:date2] == NSOrderedSame) ...

Lưu ý rằng trong trường hợp cụ thể của bạn có thể dễ dàng hơn khi đọc và viết điều này:

if ([date2 isEqualToDate:date2]) ...

Xem Tài liệu của Apple về cái này .


nhưng f ([date1 so sánh: date2] == NSOrderedSame) cũng kiểm tra giờ phút và giây và tôi không muốn nó
cycleIsBetter

1
câu hỏi của bạn hơi không rõ ràng, xin lỗi, hãy xem stackoverflow.com/questions/1889164/3092009#3092009 , bạn sẽ tìm thấy câu trả lời cho điều này.
Vincent Guerci

Câu trả lời này đúng theo cả hai cách. Để kiểm soát các thành phần ngày bạn đang so sánh sử dụngNSDateComponents
Nazir

32

Sau khi tìm kiếm stackoverflow và web rất nhiều, tôi phải nhận ra rằng cách tốt nhất để làm điều đó là như sau:

- (BOOL)isEndDateIsSmallerThanCurrent:(NSDate *)checkEndDate
{
    NSDate* enddate = checkEndDate;
    NSDate* currentdate = [NSDate date];
    NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate];
    double secondsInMinute = 60;
    NSInteger secondsBetweenDates = distanceBetweenDates / secondsInMinute;

    if (secondsBetweenDates == 0)
        return YES;
    else if (secondsBetweenDates < 0)
        return YES;
    else
        return NO;
}

Bạn cũng có thể thay đổi nó thành sự khác biệt giữa các giờ.

Thưởng thức!


Chỉnh sửa 1

Nếu bạn chỉ muốn so sánh ngày với định dạng dd / MM / yyyy, bạn cần thêm các dòng bên dưới giữa NSDate* currentdate = [NSDate date];&&NSTimeInterval distance

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]
                          autorelease]];

NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]];

currentdate = [dateFormatter dateFromString:stringDate];

1
Cảm ơn này hoạt động tốt hơn so với so sánh hoặc isEqualToDate
ArdenDev

Đã đồng ý. Tôi đã tìm thấy sự cố khi sử dụng so sánh & isEqualToDate. Chắc chắn, nó có thể là thêm 2 dòng mã, nhưng nó đáng tin cậy hơn.
Huấn luyện viên Roebuck

23

Tôi hiểu rằng bạn đang hỏi giá trị trả về là gì trong hàm so sánh.

Nếu ngày bằng nhau thì trả về NSOrderedSame

Nếu tăng dần (đối số thứ 2> đối số thứ nhất) trả về NSOrderedAscending

Nếu giảm dần (đối số thứ 2 <đối số thứ nhất) trả về NSOrderedDescending


Cách tốt để nghĩ về tăng dần và giảm dần.
David

16

Tôi không biết chính xác liệu bạn đã hỏi điều này chưa nhưng nếu bạn chỉ muốn so sánh thành phần ngày của NSDate, bạn phải sử dụng NSCalendar và NSDateComponents để loại bỏ thành phần thời gian.

Một cái gì đó như thế này sẽ hoạt động như một danh mục cho NSDate:

- (NSComparisonResult)compareDateOnly:(NSDate *)otherDate {
    NSUInteger dateFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit;
    NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents *selfComponents = [gregorianCalendar components:dateFlags fromDate:self];
    NSDate *selfDateOnly = [gregorianCalendar dateFromComponents:selfComponents];

    NSDateComponents *otherCompents = [gregorianCalendar components:dateFlags fromDate:otherDate];
    NSDate *otherDateOnly = [gregorianCalendar dateFromComponents:otherCompents];
    return [selfDateOnly compare:otherDateOnly];
}

2

NSDatethực sự đại diện cho một khoảng thời gian tính bằng giây kể từ ngày tham chiếu (tôi nghĩ là ngày 1 tháng 1 năm 2000 theo giờ UTC). Bên trong, số dấu phẩy động có độ chính xác kép được sử dụng để hai ngày tùy ý rất khó so sánh bằng nhau ngay cả khi chúng ở cùng một ngày. Nếu bạn muốn xem một ngày cụ thể có rơi vào một ngày cụ thể hay không, bạn có thể cần phải sử dụng NSDateComponents. ví dụ

NSDateComponents* dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear: 2011];
[dateComponents setMonth: 5];
[dateComponents setDay: 24];
/*
 *  Construct two dates that bracket the day you are checking.  
 *  Use the user's current calendar.  I think this takes care of things like daylight saving time.
 */
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* startOfDate = [calendar dateFromComponents: dateComponents];
NSDateComponents* oneDay = [[NSDateComponents alloc] init];
[oneDay setDay: 1];
NSDate* endOfDate = [calendar dateByAddingComponents: oneDay toDate: startOfDate options: 0];
/*
 *  Compare the date with the start of the day and the end of the day.
 */
NSComparisonResult startCompare = [startOfDate compare: myDate];
NSComparisonResult endCompare = [endOfDate compare: myDate];

if (startCompare != NSOrderedDescending && endCompare == NSOrderedDescending)
{
    // we are on the right date
} 

2

Kiểm tra Hàm sau để so sánh ngày trước hết tạo hai đối tượng NSDate và chuyển vào hàm: Thêm các dòng mã dưới đây trong viewDidload hoặc theo kịch bản của bạn.

-(void)testDateComaparFunc{

NSString *getTokon_Time1 = @"2016-05-31 03:19:05 +0000";
NSString *getTokon_Time2 = @"2016-05-31 03:18:05 +0000";
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss Z"];
NSDate *tokonExpireDate1=[dateFormatter dateFromString:getTokon_Time1];
NSDate *tokonExpireDate2=[dateFormatter dateFromString:getTokon_Time2];
BOOL isTokonValid = [self dateComparision:tokonExpireDate1 andDate2:tokonExpireDate2];}

đây là chức năng

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

BOOL isTokonValid;

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

}

return isTokonValid;}

Đơn giản chỉ cần thay đổi ngày và kiểm tra chức năng trên :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.