2010-11-11 15 views
15

Gün, ay ve yıldan NSDate nasıl oluşturulabilir? Bunu yapmak için herhangi bir yöntem görünmüyor ve sınıf yöntemini kaldırmışlardı dateWithString (bunu neden yaptılar ?!).NSDate tarih nesnesi nasıl oluşturulur?

+2

dateWithString: Bir sabit dize biçimi varsa o zaman böyle bir şey kullanabilirsiniz tarihleri ​​oluşturmak için kullanmak istediğiniz tarif etmek. Böyle bir tahmin her zaman özellikle doğru değildi ve insanların uygulamalarını yazmasını savunmanın iyi bir yolu değildi. Aşağıdaki cevaplar doğrudur - felsefi olarak, bir tarihin hangi tarihte kullanıldığını bilmeniz gerekir. Bu nedenle, Kakao sınıfları bunun etrafında düzenlenir. – Tommy

cevap

36

Bunun için bir kategoriyi yazabilirim.

// NSDateCategory.h 

#import <Foundation/Foundation.h> 

@interface NSDate (MBDateCat) 

+ (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day; 

@end 



// NSDateCategory.m 

#import "NSDateCategory.h" 

@implementation NSDate (MBDateCat) 

+ (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day { 
    NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
    NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 
    [components setYear:year]; 
    [components setMonth:month]; 
    [components setDay:day]; 
    return [calendar dateFromComponents:components]; 
} 

@end 

böyle kullanın: Bu kod böyle görünüyor, o yaptı zaten yayınlanmıştır edilenlere NSDate *aDate = [NSDate dateWithYear:2010 month:5 day:12];

+10

Sadece bir objektif C bir tarih oluşturmak için yazmak için gereken kod miktarını sadece darbeler uçurur! – TheLearner

+2

Savunma argümanı, bir NSDate'in Dünya tarihinde bir anı benzersiz olarak tanımlaması olacaktır. Bir tarih yazmanın birçok yolu vardır (bugün ortak kullanımda, en azından Gregoryen, İbranice ve İslami takvimler), bu ayrı bir mantıksal şeydir. Kakao'da, bunu netleştirmek için bir NSCalendar nesnesi kullanırsınız. Ve maliyet şu ki, bir kod satırı olmak isteyip istemediğiniz altıya denk geliyor - ki bu, fluchtpunk'un yanıtında olduğu gibi - kütüphane koduna sindirmek için yeterince kolay. – Tommy

12

Sen NSDateComponents kullanabilirsiniz:

NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:6]; 
[comps setMonth:5]; 
[comps setYear:2004]; 
NSCalendar *gregorian = [[NSCalendar alloc] 
    initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDate *date = [gregorian dateFromComponents:comps]; 
[comps release]; 
+3

Bu kabul edilen cevap olmalıdır – Woodstock

5

Biraz farklı bir cevap; demek bir dize tarih ne olduğunu tahmin etmek buluşsal yöntemlerini uygulamak o tanımlandı geçmişte çünkü gitti:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

dateFormatter.locale = [NSLocale localeWithIdentifier:@"en_US_POSIX"]; 
    // see QA1480; NSDateFormatter otherwise reserves the right slightly to 
    // modify any date string passed to it, according to user settings, per 
    // it's other use, for UI work 

dateFormatter.dateFormat = @"dd MMM yyyy"; 
    // or whatever you want; per the unicode standards 

NSDate *dateFromString = [dateFormatter dateFromString:stringContainingDate]; 
İlgili konular