これは明らかに私の最も人気のある回答なので、少しだけ多くの情報が含まれるように編集してみます。
その名前にもかかわらず、NSDateそれ自体は日付ではなく、単にマシン時間のポイントを示します。で指定された時点NSDateと、年、月、または日との間に相関関係はありません。そのためには、カレンダーを参照する必要があります。特定の時点では、表示しているカレンダーに基づいて異なる日付情報が返されます(たとえば、日付はグレゴリオ暦とユダヤ暦の両方で同じではありません)。また、グレゴリオ暦は、世界-私は仮定しています-私たちはNSDate常にそれを使用するべき少し偏見があります。NSDate幸いなことに、超党派的です。
NSCalendarあなたが述べたように、日付と時刻の取得はを通過する必要がありますが、それを行う簡単な方法があります。
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
これNSDateComponentsにより、現在のシステムカレンダーから現在の日付の日、月、年を含むオブジェクトが生成されます。(注:これは必ずしも現在のユーザー指定のカレンダーではなく、デフォルトのシステムカレンダーにすぎません。)
もちろん、別のカレンダーや日付を使用している場合は、簡単に変更できます。利用可能なカレンダーとカレンダーユニットのリストは、NSCalendarクラスリファレンスにあります。詳細についてNSDateComponentsは、「NSDateComponentsクラスリファレンス」を参照してください。
参考までに、から個々のコンポーネントにアクセスするのNSDateComponentsは簡単です。
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
注意する必要NSDateComponentsがあるのは、その有効な情報でフィールドを生成した場合(つまりNSCalendar、その情報をNSCalendarUnitsで提供するように要求した場合)を除き、要求したフィールドの有効な情報が含まれないことです。NSDateComponents参照情報自体は含まれていません。これらは、アクセスするための番号を保持する単純な構造です。たとえばから時代を取得したい場合は、フラグNSDateComponentsをNSCalendar付けてジェネレータメソッドにフィードする必要がありますNSCalendarUnitEra。