社員ブログ
HOME  社員ブログ
ホーム > iOS, 社員:ピーター > [iOS]日付の足し算

[iOS]日付の足し算

2014年05月30日 9時00分09秒

こんにちは、ピーターです。

iOSで日付の足し算や引き算を行うメソッドを2つご紹介します。

ひとつ目はNSDateクラスのdateByAddingTimeInterval:メソッドです。

- (id)dateByAddingTimeInterval:(NSTimeInterval)seconds

指定した秒数をNSDateオブジェクトに足します。
引き算したい時はマイナスの秒数を指定します。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSInteger secondsOfDay = 60 * 60 * 24; // 1日の秒数
NSDate *today = [formatter dateFromString:@"2014-05-29 19:30:00"];
NSDate *tommorow = [today dateByAddingTimeInterval:secondsOfDay];
NSDate *yesterday = [today dateByAddingTimeInterval:-secondsOfDay];

NSLog(@"%@", [formatter stringFromDate:today]);
// > 2014-05-29 19:30:00

NSLog(@"%@", [formatter stringFromDate:tommorow]);
// > 2014-05-30 19:30:00

NSLog(@"%@", [formatter stringFromDate:yesterday]);
// > 2014-05-28 19:30:00

この方法は1日後のように、秒数で指定できるものには向いているのですが、1ヶ月後や1年後といった足し算には不向きです。

そこでふたつ目は、NSCalendarクラスのdateByAddingComponents:toDate:options:メソッドです。

- (NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSUInteger)opts

足したい月数や年数をNSDateComponentsオブジェクトで指定します。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *today = [formatter dateFromString:@"2014-05-29 19:30:00"];

// 1年2ヶ月後を指定
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:1];
[comps setMonth:2];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [calendar dateByAddingComponents:comps toDate:today options:0];

NSLog(@"%@", [formatter stringFromDate:today]);
// > 2014-05-29 19:30:00

NSLog(@"%@", [formatter stringFromDate:date]);
// > 2015-07-29 19:30:00

ちなみに、NSDateオブジェクトから年や月などを取得したい場合、NSDateオブジェクトをNSDateComponentsオブジェクトに変換すると便利です。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSDate *today = [formatter dateFromString:@"2014-05-29 19:30:00"];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit;
NSDateComponents *comps = [calendar components:unitFlags fromDate:today];

NSLog(@"%ld", (long)comps.year);
// > 2014

NSLog(@"%ld", (long)comps.month);
// > 5

NSLog(@"%ld", (long)comps.day);
// > 29

NSLog(@"%ld", (long)comps.weekday);
// > 5

NSDateComponentsオブジェクトからNSDateオブジェクトに変換することもできます


NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:2014];
[comps setMonth:5];
[comps setDay:29];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *today = [calendar dateFromComponents:comps];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSLog(@"%@", [formatter stringFromDate:today]);
// > 2014-05-29 00:00:00

iOS, 社員:ピーター

  1. コメントはまだありません
  1. トラックバックはまだありません