iOS: İki tarihi karşılaştırın


96

Bir var NSDateben diğer iki ile karşılaştırmak gerektiğini NSDateve birlikte deneyin NSOrderAscendingve NSOrderDescendingancak benim tarih diğer iki tarihlerde eşit olur?

Örnek: Bir varsa myDate = 24/05/2011 diğeri olan iki = 24/05/2011ve iki 24/05/2011kullanabilirim ne olacak?


1
Sorunuzu tam olarak anlamıyorum, neyi başarmaya çalışıyorsunuz?
arclight

tarih bir ve iki tarih bir = 15/05/2011 ve iki = 31/05/2011 olabilir, ancak aynı gün olmalılar bir = 24/05/2011 ve iki = 24/05/2011 o zaman kontrol etmeliyim myData, birinci tarih ile ikinci tarih arasında
CyclingIsBetter

Sadece yılı, ayı ve tarihi çıkarın ve bu sırayla karşılaştırın. Beraberlik varsa, sonraki alanı karşılaştırın.
Himadri Choudhury

Yanıtlar:


210

Göre Apple belgelerineNSDate compare:

Alıcının zamansal sırasını ve verilen başka bir tarihi gösteren bir NSComparisonResult değeri döndürür.

- (NSComparisonResult)compare:(NSDate *)anotherDate

Parametreler anotherDate

Alıcının karşılaştırılacağı tarih. Bu değer sıfır olmamalıdır. Değer sıfır ise, davranış tanımsızdır ve Mac OS X'in gelecekteki sürümlerinde değişebilir.

Geri dönüş değeri

Eğer:

Alıcı ve diğer tarih birbirine tam olarak eşittir, NSOrderedSame

Alıcı, başka bir Tarihten daha geç bir zamanda, NSOrderedDescending

Alıcı, başka bir Date'den daha erken bir zamanda, NSOrderedAscending

Diğer bir deyişle:

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

Sizin durumunuzda bunu okuyup yazmanın daha kolay olabileceğini unutmayın:

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

Bununla ilgili Apple Belgelerine bakın .


ancak f ([date1 Compare: date2] == NSOrderedSame) saat dakika ve saniyeyi de kontrol et ve bunu istemiyorum
CyclingIsBetter

1
Sorunuz biraz belirsizdi üzgünüm, stackoverflow.com/questions/1889164/3092009#3092009'a bir göz atın , bunun cevabını bulacaksınız.
Vincent Guerci

Bu cevap her iki yönden de doğrudur. Karşılaştırdığınız tarih bileşenlerini kontrol etmek içinNSDateComponents
Nazir

32

Stackoverflow ve web'i çok aradıktan sonra, bunu yapmanın en iyi yolunun şu şekilde olduğu sonucuna varmalıyım:

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

Bunu saatler arasındaki farka da değiştirebilirsiniz.

Zevk almak!


Düzenle 1

Tarihi yalnızca gg / AA / yyyy formatıyla karşılaştırmak istiyorsanız, NSDate* currentdate = [NSDate date];&& arasına aşağıdaki satırları eklemeniz gerekir.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
Teşekkürler, bu karşılaştırma veya
eşittirEqualToDate'den

Kabul. Compar & isEqualToDate işlevini kullanırken sorunlar buldum. Elbette, fazladan 2 satırlık bir kod olabilir, ancak daha güvenilirdir.
Koç Roebuck

23

Anladığım kadarıyla karşılaştırma fonksiyonunda dönüş değerinin ne olduğunu soruyorsunuz.

Tarihler eşitse geri döner NSOrderedSame

Artan ise (2. bağımsız değişken> 1. bağımsız değişken) NSOrderedAscending

Azalan ise (2. bağımsız değişken <1. bağımsız değişken) dönüş NSOrderedDescending


Yükselmeyi ve alçalmayı düşünmenin iyi bir yolu.
David

16

Bunu tam olarak sorup sormadığınızı bilmiyorum, ancak bir NSDate'in yalnızca tarih bileşenini karşılaştırmak istiyorsanız, saat bileşenini kaldırmak için NSCalendar ve NSDateComponents kullanmanız gerekir.

Bunun gibi bir şey NSDate için bir kategori olarak çalışmalıdır:

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

NSDateaslında bir referans tarihinden itibaren saniye cinsinden bir zaman aralığını temsil eder (1 Ocak 2000 UTC sanırım). Dahili olarak, çift duyarlıklı bir kayan nokta sayısı kullanılır, bu nedenle iki rastgele tarihin aynı gün olsalar bile aynı değerleri karşılaştırması pek olası değildir. Belirli bir tarihin belirli bir güne denk gelip gelmediğini görmek istiyorsanız, muhtemelen kullanmanız gerekir NSDateComponents. Örneğin

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

Tarih karşılaştırması için aşağıdaki İşlevi kontrol edin, öncelikle iki NSDate nesnesi oluşturun ve işleve geçin: viewDidload'a veya senaryonuza göre aşağıdaki kod satırlarını ekleyin.

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

işte fonksiyon

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

Sadece tarihi değiştirin ve yukarıdaki işlevi test edin :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.