これは明らかに私の最も人気のある回答なので、少しだけ多くの情報が含まれるように編集してみます。
その名前にもかかわらず、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
、その情報をNSCalendarUnit
sで提供するように要求した場合)を除き、要求したフィールドの有効な情報が含まれないことです。NSDateComponents
参照情報自体は含まれていません。これらは、アクセスするための番号を保持する単純な構造です。たとえばから時代を取得したい場合は、フラグNSDateComponents
をNSCalendar
付けてジェネレータメソッドにフィードする必要がありますNSCalendarUnitEra
。