これは明らかに私の最も人気のある答えなので、もう少し情報が含まれるように編集してみます。
その名前にもかかわらず、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