Görünüşe göre bu benim en popüler cevabım olduğu için, biraz daha fazla bilgi içerecek şekilde düzenlemeye çalışacağım.
İsmine rağmen, NSDatekendi başına bir tarih değil, makine zamanında bir noktayı işaretler. Bir NSDateile bir yıl, ay veya gün arasında belirtilen zaman noktası arasında bir ilişki yoktur . Bunun için bir takvime başvurmanız gerekir. Zaman içinde verilen herhangi bir nokta, hangi takvime baktığınıza bağlı olarak farklı tarih bilgileri döndürür (örneğin hem Gregoryen hem de Yahudi takvimlerinde tarihler aynı değildir) ve Gregoryen takvimi, dünya - varsayıyorum - NSDateher zaman kullanması gereken biraz önyargılıyız . NSDate, neyse ki, çok daha iki taraflı.
NSCalendarBahsettiğiniz gibi, tarih ve saati almak zorunda kalacak , ancak bunu yapmanın daha basit bir yolu var:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Bu NSDateComponents, geçerli günün geçerli sistem takviminden gün, ay ve yılı içeren bir nesne oluşturur . ( Not: bu, kullanıcının belirlediği geçerli takvim olmak zorunda değildir , yalnızca varsayılan sistem takvimidir.)
Elbette, farklı bir takvim veya tarih kullanıyorsanız, bunu kolayca değiştirebilirsiniz. Mevcut takvimlerin ve takvim birimlerinin bir listesi NSCalendarSınıf Referansında bulunabilir . Hakkında daha fazla bilgi NSDateComponentsbulunabilir NSDateComponentsSınıf Referans .
Referans olarak, bileşenlerden tek tek erişmek NSDateComponentsoldukça kolaydır:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Dikkatli olmanız gerekir: NSDateComponentsbunları geçerli bilgilerle oluşturmadıkça (yani NSCalendarbu bilgileri NSCalendarUnits sağlama talebi) istediğiniz herhangi bir alan için geçerli bilgi içermez . NSDateComponentskendi başlarına hiçbir referans bilgisi içermez - bunlar sadece erişmeniz için sayıları tutan basit yapılardır. Ayrıca örneğin bir çağ almak istiyorsanız, dışarı NSDateComponents, içinden jeneratör yöntemini beslemek gerekir NSCalendarile NSCalendarUnitErabayrak.