[iOS]日付の足し算
こんにちは、ピーターです。
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
最近のコメント