日付計算のうちよく使う可能性の高いものを紹介。
オフセット付きのNSDate生成
NSDate生成時に現在の時刻に指定秒のオフセットを加え、過去や未来の時刻を指定する。
NSDate* date; date = [NSDate dateWithTimeIntervalSinceNow:0.0f]; // 現在の時刻 NSLog(@"現在の時刻 -> %@", date); date = [NSDate dateWithTimeIntervalSinceNow:3*60]; // 3分後 NSLog(@"3分後 -> %@", date); date = [NSDate dateWithTimeIntervalSinceNow:3*60*60]; // 3時間後 NSLog(@"3時間後 -> %@", date); date = [NSDate dateWithTimeIntervalSinceNow:3*24*60*60]; // 3日後 NSLog(@"3日後 -> %@", date); date = [NSDate dateWithTimeIntervalSinceNow:-5*24*60*60]; // 5日前(マイナスを指定する事で過去に) NSLog(@"5日前(マイナスを指定する事で過去に) -> %@", date);
出力
現在の時刻 -> 2010-06-10 01:29:02 +0900 3分後 -> 2010-06-10 01:32:02 +0900 3時間後 -> 2010-06-10 04:29:02 +0900 3日後 -> 2010-06-13 01:29:02 +0900 5日前(マイナスを指定する事で過去に) -> 2010-06-05 01:29:02 +0900
NSDateにオフセットを加えたものをNSDateで取得
NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init]; [inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"]; NSDate *orgDate = [inputDateFormatter dateFromString:@"2000/01/02 00:00:00"]; NSLog(@"設定した時刻 -> %@", orgDate); NSDate *resDate; resDate = [orgDate initWithTimeInterval:3*60 sinceDate:orgDate]; // orgDateから3分後 NSLog(@"3分後 -> %@", resDate); resDate = [orgDate initWithTimeInterval:3*60*60 sinceDate:orgDate]; // orgDateから3時間後 NSLog(@"3時間後 -> %@", resDate); resDate = [orgDate initWithTimeInterval:3*24*60*60 sinceDate:orgDate]; // orgDateから3日後 NSLog(@"3日後 -> %@", resDate); resDate = [orgDate initWithTimeInterval:-5*24*60*60 sinceDate:orgDate]; // orgDateから5日前(マイナスを指定する事で過去に) NSLog(@"5日前 -> %@", resDate); [inputDateFormatter release];
出力
設定した時刻 -> 2000-01-02 00:00:00 +0900 3分後 -> 2000-01-02 00:03:00 +0900 3時間後 -> 2000-01-02 03:00:00 +0900 3日後 -> 2000-01-05 00:00:00 +0900 5日前 -> 1999-12-28 00:00:00 +0900
指定の月の末日を求める
// 2000年の2月の末日を求める(翌月の1日の1日前で計算) NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init]; [inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"]; NSDate *orgDate = [inputDateFormatter dateFromString:@"2000/03/01 00:00:00"]; NSDate *resDate = [orgDate initWithTimeInterval:-1*24*60*60 sinceDate:orgDate]; // 1日前 NSLog(@"2000年の2月の末日 -> %@", resDate); [inputDateFormatter release];
出力
2000年の2月の末日 -> 2000-02-29 00:00:00 +0900
過去、未来の比較
2つのNSDateのうち、より過去のものや未来のものを返す。
NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init]; [inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"]; NSDate *dateA = [inputDateFormatter dateFromString:@"2000/03/01 00:00:00"]; NSDate *dateB = [inputDateFormatter dateFromString:@"2000/03/03 00:00:00"]; // 2つの日付のうち、より過去の日を返す NSLog(@"%@, %@ -> %@", dateA, dateB, [dateA earlierDate:dateB]); // 2つの日付のうち、より未来の日を返す NSLog(@"%@, %@ -> %@", dateA, dateB, [dateA laterDate:dateB]); [inputDateFormatter release];
出力
2000-03-01 00:00:00 +0900, 2000-03-03 00:00:00 +0900 -> 2000-03-01 00:00:00 +0900 2000-03-01 00:00:00 +0900, 2000-03-03 00:00:00 +0900 -> 2000-03-03 00:00:00 +0900
2つの時刻の差を取得
NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init]; [inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"]; NSDate *dateA = [inputDateFormatter dateFromString:@"2000/03/01 00:00:00"]; NSDate *dateB = [inputDateFormatter dateFromString:@"2000/03/03 00:00:00"]; NSTimeInterval since; // dateAとdateBの時間の間隔を取得(dateA - dateBなイメージ) since = [dateA timeIntervalSinceDate:dateB]; NSLog(@"%f秒", since); NSLog(@"%f分", since/60); NSLog(@"%f時", since/(60*60)); NSLog(@"%f日", since/(24*60*60)); // dateBとdateAの時間の間隔を取得(dateB - dateAなイメージ) since = [dateB timeIntervalSinceDate:dateA]; NSLog(@"%f秒", since); NSLog(@"%f分", since/60); NSLog(@"%f時", since/(60*60)); NSLog(@"%f日", since/(24*60*60)); [inputDateFormatter release];
出力
-172800.000000秒 -2880.000000分 -48.000000時 -2.000000日 172800.000000秒 2880.000000分 48.000000時 2.000000日
今日の日付のみ(時分を含まない)を取得
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; NSString *nowDateStr = [dateFormatter stringFromDate:[NSDate date]]; NSDate *nowDate = [dateFormatter dateFromString:nowDateStr]; NSLog(@"%@", nowDate); [dateFormatter release];
出力
2010-06-10 00:00:00 +0900