NSDate
他の情報がない場合、オブジェクトの年/月/日を取得するにはどうすればよいでしょうか? おそらく次のような方法でこれを行うことができると思います。
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
しかし、年/月/日を取得するという単純なことなのに、これはかなり面倒なようですNSDate
。他に解決策はありますか?
ベストアンサー1
どうやらこれが私の回答の中で最も人気のあるものなので、もう少し情報を追加して編集してみます。
名前にもかかわらず、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
)、要求したフィールドの有効な情報は含まれません。NSDateComponents
には、それ自体には参照情報は含まれません。これらは、アクセスする数値を保持する単純な構造にすぎません。 たとえば、 から時代も取得したい場合は、 からのジェネレーター メソッドにフラグNSDateComponents
を入力する必要があります。NSCalendar
NSCalendarUnitEra