2010-05-23 17 views
9

Eh, bu bin kere istendi, ama nedense answeres gerçekten dont iş veya başka sorunlar vardı sanırım ....Bugün veya Dün seçeneği NSDate karşılaştırın Neyse burada

Ne sahip "çalışıyor ":

sorun (lar) Şimdi
NSCalendar *calendar = [NSCalendar currentCalendar];  
    NSDate *currentDate = [NSDate date]; 
    NSDateComponents *comps = [[NSDateComponents alloc] init]; 
    // set tomorrow (0: today, -1: yesterday) 
    [comps setDay:0]; 
    NSDate *dateToday = [calendar dateByAddingComponents:comps toDate:currentDate options:0]; 
    [comps setDay:-1]; 
    NSDate *dateYesterday = [calendar dateByAddingComponents:comps toDate:currentDate options:0]; 
    [comps release]; 


NSString *todayString = [self.dateFormatter stringFromDate:dateToday] ; 
NSString *yesterdayString = [self.dateFormatter stringFromDate:dateYesterday] ; 
NSString *refDateString = [self.dateFormatter stringFromDate:info.date]; 

if ([refDateString isEqualToString:todayString]) 
{ 
    cell.title.text = @"Today"; 
} else if ([refDateString isEqualToString:yesterdayString]) 
{ 
    cell.title.text = @"Yesterday"; 
} else 
{ 
    cell.title.text = [self.dateFormatter stringFromDate:info.date]; 
} 

:

daha kolay bir yolu yoktur, sadece bir randevu comparinson için kod bir awefull sürü gibi görünüyor?

Ve en önemli soru, tüm nesnelerin serbest bırakılmasıdır. Tahmin etmiş olabileceği gibi, bunu bir UITableViewController'da kullanıyorum. ,

//[calendar release]; 
//[currentDate release]; 
//[dateToday release]; 
//[dateYesterday release]; 
//[todayString release]; 
//[yesterdayString release]; 
//[refDateString release]; 

sorun en kısa zamanda bu satırlardan birini yorumsuz o benim app çöker ve neden hiçbir fikrim yok: Ben de kodunda bu satırları var?! Umarım biri beni burada aydınlatır.

Çok teşekkürler.

+1

Eh, son bit kolaydır: Eğer Bu nesnelerden hiçbirine sahip değilsiniz, bu yüzden sizin çıkacak değilsiniz. comps, ayırdığınız tek nesnedir. Diğerlerinin hepsi otomatik olarak iade edilir veya hiç serbest bırakılmayacaktır. – walkytalky

+0

sayesinde iyi bir açıklama;) 'isEqualToDate – elementsense

cevap

12

bunu yapmanın en kolay yolu, sadece tarihlerin description karşılaştırmaktır:

// Your dates: 
NSDate * today = [NSDate date]; 
NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-86400]; //86400 is the seconds in a day 
NSDate * refDate; // your reference date 

// 10 first characters of description is the calendar date: 
NSString * todayString = [[today description] substringToIndex:10]; 
NSString * yesterdayString = [[yesterday description] substringToIndex:10]; 
NSString * refDateString = [[refDate description] substringToIndex:10]; 

if ([refDateString isEqualToString:todayString]) 
{ 
    cell.title.text = @"Today"; 
} else if ([refDateString isEqualToString:yesterdayString]) 
{ 
    cell.title.text = @"Yesterday"; 
} else 
{ 
    cell.title.text = refDateString; 
} 

bunun yerine descriptionWithLocale: kullanabilirsiniz tarih dize biçimini değiştirmek isterseniz.

+15

Açıklama yönteminin sonucuna güvenmeyin. Öncelikle hata ayıklama amaçları için vardır ve kalıcı veya tersinir olması garanti edilmez. Bu dize karşılaştırma yaklaşımını kullanmak istiyorsanız, istediğiniz tam dizeyi oluşturmak için açık bir NSDateFormatter kullanın. Ama bunun yerine NSCalendar tarafından üretilen bileşenleri karşılaştırabildiğinizden biraz fazla. –

+0

Açıklama yöntemi (iOS 7.1'de) alıyorum (GMT) tarihini GMT'ye gönderiyor, bu da geçerli kullanıcının saat diliminin GMT'den sapmasıyla kapalı olacak demektir. Benim için bugün 6 saat erken başlıyor demektir. – dwsolberg

-1

isEqualToDate yöntemini kullanarak iki NSDate nesnesini karşılaştırabilirsiniz, tarihlerin eşit olup olmadığını söyleyen bir bool (evet veya hayır) döndürecektir. Bakınız Apple Documentation.

Nesnelerin bırakılmasıyla ilgili olarak, objektif-c'deki kural, yalnızca yönteminiz sırasında bellek ayırdığınız nesneleri serbest bırakmanızdır. Özellikle kodunuzda bellek ayırmak için kullandığınız tek nesne derlemedir, böylece yayınlamanız gereken tek şey budur - ve siz bunu yaptınız. Hiçbir zaman ayırmadığınız nesneler için belleği bırakmak muhtemelen uygulamanızın çökmesine neden oluyordur. Bu nesneleri gerçekten tahsis eden yöntemler onları serbest bırakmaya çalışırsa veya bunlara başka bir başvuru onlara erişmeye çalıştığında, onları zaten serbest bıraktığınız gibi bir EXC_BAD_ACCESS hatasını tetikler!

Dolayısıyla, bu sürüm satırlarını yorumlamayın, bunları komut dosyasından silin - bunlara gerek yoktur!

+1

:' burada çalışmaz. Tarihler "tam olarak" aynıysa "YES" i döndürür: "Bu yöntem, tarihler arasındaki alt saniye farklarını algılar." (Sınıf referansından.) – mohsenr

6

Bunun eski bir soru olduğunu biliyorum, ama kendiminkine benzer bir şey yapıyorum ve üzerine geldim.

Her şeyden önce, iOS 4.0'dan (ve Mac OS 10.6), NSDateFormatter'dan itibaren göreli tarihler yapabilirsiniz, bu size "Bugün" ve "Dün" otomatik olarak verir.

2014-03-15 15:26:37.683 TestApp[1293:303] date = Today 

Ancak OP, bugün veya dün için ben de bir yana, göreceli tarih biçimlendirme yapmak istediği şey bir NSDate karşılaştırmak nasıl soruyordu: çıkışı

NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; 
[formatter setTimeStyle:NSDateFormatterNoStyle]; 
[formatter setDateStyle:NSDateFormatterShortStyle]; 
[formatter setDoesRelativeDateFormatting:YES]; 

NSString* dateString = [formatter stringFromDate:[NSDate date]];  
NSLog(@"date = %@", dateString); 

.Burada NSDate bir kategori olarak uygulanan ile geldi ne:

@implementation NSDate (IsToday) 

- (BOOL) isToday 
{ 
    NSCalendar* calendar = [NSCalendar currentCalendar]; 

    // Components representing the day of our date. 
    NSDateComponents* dateComp = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit 
              fromDate:self]; 
    NSDate* date = [calendar dateFromComponents:dateComp]; 

    // Components representing today. 
    NSDateComponents* todayComp = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit 
               fromDate:[NSDate date]]; 
    NSDate* todayDate = [calendar dateFromComponents:todayComp]; 

    // If the dates are equal, then our date is today. 
    return [date isEqualToDate:todayDate]; 
} 

@end 

Ben bugün yaratılan şeylerin zamanını görüntülemek böylece bu yapmak istediği nedeni ve bugün oluşturulmamış şeylerin tarih - Mail.app iletilerindeki tarihleri ​​nasıl gösterir. Bu şuna benzer:

- (NSString*) postDateToString:(NSDate*)aDate 
{ 
    static NSDateFormatter* todayFormatter = nil; 
    if(todayFormatter == nil) { 
     todayFormatter = [[NSDateFormatter alloc] init]; 
     [todayFormatter setTimeStyle:NSDateFormatterShortStyle]; 
     [todayFormatter setDateStyle:NSDateFormatterNoStyle]; 
    } 

    static NSDateFormatter* notTodayFormatter = nil; 
    if(notTodayFormatter == nil) { 
     notTodayFormatter = [[NSDateFormatter alloc] init]; 
     [notTodayFormatter setTimeStyle:NSDateFormatterNoStyle]; 
     [notTodayFormatter setDateStyle:NSDateFormatterShortStyle]; 
     [notTodayFormatter setDoesRelativeDateFormatting:YES]; 
    } 

    NSDateFormatter* formatter = notTodayFormatter; 

    if([aDate isToday]) { 
     formatter = todayFormatter; 
    } 

    return [formatter stringFromDate:aDate]; 
} 
2

bu açık kaynak projesi kullanmayı önerebilir: https://github.com/erica/NSDate-Extensions

Geçerli yöntemler kontrol edebilirsiniz:

+ (NSDate *) dateTomorrow 
+ (NSDate *) dateYesterday 
+0

Bu büyük bir uzantı - teşekkürler Kriv. KakaoPod desteği de: pod 'NSDate-Extensions', '~> 0.0.1' – Fraser

İlgili konular