立体視、WebGL辺りにお熱です。整理された情報は こちら へどうぞ。
2010年06月09日
■[iPhoneプログラミング]NSDate - 日付の計算、過去の日や末日を求める方法
日付計算のうちよく使う可能性の高いものを紹介。
オフセット付きの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年の3月の末日 -> 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
エレコム
購入: 27人 クリック: 456回
購入: 27人 クリック: 456回
トラックバック - http://d.hatena.ne.jp/nakamura001/20100609/1276101689
リンク元
- 664 http://www.google.co.jp/url?sa=t&rct=j&q=nsdate&source=web&cd=3&ved=0CDcQFjAC&url=http://d.hatena.ne.jp/nakamura001/20100609/1276101689&ctbs=lr:lang_1ja&ei=XLKFTpThD4qbmQXx1b3yDw&usg=AFQjCNFRsCUUowa0BaBP1NTjf5SlnlGwJw
- 658 http://www.google.co.jp/search?client=safari&rls=en&q=NSDate&ie=UTF-8&oe=UTF-8&redir_esc=&ei=q2xPTKaQLZCycaDfxbUB
- 478 http://www.google.co.jp/search?q=NSDate&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP-mac:official&hl=ja&client=firefox-a
- 477 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=NSDate+作成
- 391 http://www.srcw.net/wiki/index.php?Objective-C/日付と時刻
- 380 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=nsdate+差
- 285 http://www.google.co.jp/url?sa=t&rct=j&q=nsdate 比較&source=web&cd=2&ved=0CDEQFjAB&url=http://d.hatena.ne.jp/nakamura001/20100609/1276101689&ei=LyGETpOKO-HSmAWz8oQC&usg=AFQjCNFRsCUUowa0BaBP1NTjf5SlnlGwJw&sig2=Xy13tGbvCeGfEn9MR3
- 244 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/nakamura001/20100609/1276101689&rct=j&q=nsdate 日付計算&ei=ZMGvTcv-O5CmvgOe_KmbBw&usg=AFQjCNFRsCUUowa0BaBP1NTjf5SlnlGwJw&sig
- 191 http://www.google.co.jp/search?hl=ja&client=safari&rls=en&q=NSDateFormatter+yyyy-MM-dd&aq=f&aqi=&aql=&oq=&gs_rfai=
- 150 http://www.google.co.jp/search?client=safari&rls=en&q=nsdate+日付時分秒&ie=UTF-8&oe=UTF-8&redir_esc=&ei=AGUQTLrcAofQcY6YtYcN


