iOS: เปรียบเทียบสองวันที่


96

ฉันมีสิ่งNSDateที่ฉันต้องเปรียบเทียบกับอีกสองคนNSDateและฉันลองใช้NSOrderAscendingและNSOrderDescendingแต่ถ้าวันที่ของฉันเท่ากันในอีกสองวัน?

ตัวอย่าง: ถ้าฉันมีmyDate = 24/05/2011 และอีกสองตัวที่เป็นหนึ่ง = 24/05/2011และสอง24/05/2011ฉันจะใช้อะไรได้บ้าง?


1
ฉันไม่เข้าใจคำถามของคุณทั้งหมดคุณกำลังพยายามทำอะไรอยู่?
arclight

วันที่หนึ่งและวันที่สองสามารถเป็นหนึ่ง = 15/05/2011 และสอง = 31/05/2011 แต่ต้องเป็นวันเดียวกันด้วยหนึ่ง = 24/05/2011 และสอง = 24/05/2011 ฉันต้องตรวจสอบว่า myData อยู่ระหว่างวันที่หนึ่งและวันที่สอง
cyclingIsBetter

เพียงแยกปีเดือนและวันที่และเปรียบเทียบตามลำดับนั้น หากเสมอกันให้เปรียบเทียบฟิลด์ถัดไป
Himadri Choudhury

คำตอบ:


210

ตามเอกสารของ AppleNSDate compare:

ส่งคืนค่า NSComparisonResult ที่ระบุลำดับชั่วคราวของผู้รับและวันที่กำหนดอื่น

- (NSComparisonResult)compare:(NSDate *)anotherDate

พารามิเตอร์ anotherDate

วันที่ที่จะเปรียบเทียบเครื่องรับ ค่านี้ต้องไม่เป็นศูนย์ หากค่าเป็นศูนย์แสดงว่าไม่ได้กำหนดลักษณะการทำงานและอาจเปลี่ยนแปลงใน Mac OS X เวอร์ชันอนาคต

ส่งคืนค่า

ถ้า:

ผู้รับและวันที่อื่นมีค่าเท่ากันทุกประการ NSOrderedSame

ผู้รับมาช้ากว่าวันอื่น NSOrderedDescending

ผู้รับเร็วกว่าวันอื่น NSOrderedAscending

กล่าวอีกนัยหนึ่ง:

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

โปรดทราบว่าในกรณีเฉพาะของคุณอาจง่ายกว่าในการอ่านและเขียนสิ่งนี้:

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

ดูเอกสารแอปเปิ้ลเกี่ยวกับเรื่องนี้


แต่ f ([date1 เปรียบเทียบ: date2] == NSOrderSame) ตรวจสอบชั่วโมงนาทีและวินาทีด้วยและฉันไม่ต้องการ
CyclingIsBetter

1
คำถามของคุณไม่ชัดเจนเล็กน้อยขออภัยดูที่stackoverflow.com/questions/1889164/3092009#3092009คุณจะพบคำตอบนี้
Vincent Guerci

คำตอบนี้ถูกต้องทั้งสองวิธี ในการควบคุมส่วนประกอบวันที่ที่คุณกำลังเปรียบเทียบการใช้งานNSDateComponents
Nazir

32

หลังจากค้นหา stackoverflow และเว็บเป็นจำนวนมากฉันต้องสรุปว่าวิธีที่ดีที่สุดในการทำเช่นนี้:

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

คุณสามารถเปลี่ยนเป็นความแตกต่างระหว่างชั่วโมงได้เช่นกัน

สนุก!


แก้ไข 1

ถ้าคุณต้องการเปรียบเทียบวันที่กับรูปแบบของ dd / MM / yyyy เท่านั้นคุณต้องเพิ่มบรรทัดด้านล่างระหว่าง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
ขอบคุณสิ่งนี้ทำงานได้ดีกว่าการเปรียบเทียบหรือ isEqualToDate
ArdenDev

ตกลง ฉันพบปัญหาในการใช้ Compare & isEqualToDate แน่นอนว่าอาจเป็นโค้ดพิเศษ 2 บรรทัด แต่เชื่อถือได้มากกว่า
Coach Roebuck

23

ฉันคิดว่าคุณกำลังถามว่าค่าส่งคืนคืออะไรในฟังก์ชันเปรียบเทียบ

หากวันที่เท่ากันแล้วจะกลับมา NSOrderedSame

ถ้าจากน้อยไปมาก (2nd arg> 1st arg) ส่งกลับ NSOrderedAscending

ถ้ามากไปหาน้อย (2nd arg <1st arg) return NSOrderedDescending


วิธีที่ดีในการคิดจากน้อยไปมาก
เดวิด

16

ฉันไม่ทราบแน่ชัดว่าคุณถามสิ่งนี้หรือไม่ แต่ถ้าคุณต้องการเปรียบเทียบส่วนประกอบวันที่ของ NSDate เท่านั้นคุณต้องใช้ NSCalendar และ NSDateComponents เพื่อลบองค์ประกอบเวลา

สิ่งนี้ควรทำงานเป็นหมวดหมู่สำหรับ 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

NSDateจริงๆแล้วแสดงถึงช่วงเวลาเป็นวินาทีนับตั้งแต่วันที่อ้างอิง (1 มกราคม 2543 UTC ฉันคิดว่า) ภายในจะมีการใช้เลขทศนิยมที่มีความแม่นยำสองเท่าดังนั้นวันที่ที่กำหนดเองสองวันจึงไม่น่าจะเปรียบเทียบได้อย่างเท่าเทียมกันแม้ว่าจะอยู่ในวันเดียวกันก็ตาม NSDateComponentsหากคุณต้องการที่จะดูว่าเฉพาะวันที่ตรงกับวันหยุดโดยเฉพาะอย่างยิ่งที่คุณอาจจำเป็นต้องใช้ เช่น

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

ตรวจสอบฟังก์ชันต่อไปนี้สำหรับการเปรียบเทียบวันที่ก่อนอื่นให้สร้างวัตถุ NSDate สองชิ้นและส่งผ่านไปยังฟังก์ชัน: เพิ่มบรรทัดต่อไปนี้ของโค้ดใน viewDidload หรือตามสถานการณ์ของคุณ

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

นี่คือฟังก์ชั่น

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

เพียงแค่เปลี่ยนวันที่และทดสอบฟังก์ชันด้านบน :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.