年や日などを指定して NSDate を作成する - Objective-C プログラミング
PROGRAM
年や日などを指定して NSDate を作成する
NSDate 型のデータ型は、NSCalendar を使用することで、年・月・日や、曜日、時・分・秒、タイムゾーンなどの情報を指定して作成することができます。
例えば、2012 年 6 月 23 日に NSDate を作成したい場合は、次のようにします。
// NSCalendar を取得します。
NSCalendar* calendar = [NSCalendar currentCalendar];
// NSDateComponents を作成して、そこに作成したい情報をセットします。
NSDateComponents* components = [[NSDateComponents alloc] init];
components.year = 2012;
components.month = 6;
components.day = 23;
// NSCalendar を使って、NSDateComponents を NSDate に変換します。
NSDate* date = [calendar dateFromComponents:components];
これで、目的の日付を NSDate で取得することができました。
デバッガなどでみると、GMT 表記で時刻がずれていたり、日付が前日になっていたりするように見えたりしますけど、扱い上は問題ないようです。
日付が前後していたとしても、このようにして生成した日付からまた NSDateComponents を取るときにも、タイムゾーンが考慮されてちゃんとした値が取得できる様子でした。
1年の指定した週目の最初の日付を取得する
これを使うと、1 年の指定した週の最初の日付を取得することも可能なようでした。
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [[NSDateComponents alloc] init];
components.yearForWeekOfYear = 2012;
components.weekOfYear = 20;
NSDate* date = [calendar dateFromComponents:components];
このように、基準となる年数 yearForWeekOfYear と、何週目かを示す weekOfYear を設定してあげれば、それに該当する最初の日を取得することができました。
同じようにして月からの何週目の最初を取れればよかったのですけど、year と month と weekOfMonth を設定するだけでは、その年月の 1 日になってしまうようでした。
第何週目の曜日の日付を取得する
目的の月の、例えば第 3 週目の月曜日といった日付も取得可能です。
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [[NSDateComponents alloc] init];
components.year = 2012;
components.month = 6;
components.weekday = 2;
components.weekdayOrdinal = 3;
NSDate* date = [calendar dateFromComponents:components];
このように、年 (year) 月 (month) と合わせて、第何週 (weekdayOrdinal) 目の何曜日 (weekday) を指定します。
これで日付を作成すると、例えば上記の例では、2012 年 6 月の、第 3 週目の月曜日が取得できました。
ちなみに曜日は、日曜日が 1 で、月曜日、火曜日と続いて、最後が 7 の土曜日になります。
月の末日を取得する
日付指定はマイナスも受け付けてくれるので、ある年月の何日前を取得することも可能です。
これを利用して、ある月の末日を取得することもできました。
たとえば、2012 年の 2 月末日を取得してみます。
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [[NSDateComponents alloc] init];
components.year = 2012;
components.month = 3;
components.weekday = -1;
NSDate* date = [calendar dateFromComponents:components];
このように、年 (year) に続けて、目的の月のひとつ先 (month) を指定します。
そして日 (day) に -1 を指定することで、前月の末日を取得することができました。
前月でなくても -10 で 10 日前といった指定も可能です。
[ もどる ]