Help us understand the problem. What is going on with this article?

NSDateのTips

More than 5 years have passed since last update.

たまに忘れるのでメモ、あんまり増えないかも

現在時刻の取得

NSDate *date = [NSDate date];
// 2014-02-17 14:17:01 +0000

注意
ここでいう現在時刻というのは、iOSの設定 > 一般 > 日付と時刻で指定されたものになります

dateFormat

カスタムフォーマットを指定したい場合はNSDate.dataFormatまたはsetDateFormat:を使う

NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

/* 12時間表記 */
dateFormatter.dateFormat = @"yyyy/MM/dd hh:mm:ss";
NSString *date12 = [dateFormatter stringFromDate:date];
// 2014/02/18 11:08:12

/* 24時間表記 */
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSString *date24 = [dateFormatter stringFromDate:date];
// 2014/02/18 23:08:12

/* 0埋め表記 */
dateFormatter.dateFormat = @"yyyy/M/d h:m:s";
NSString *date0 = [dateFormatter stringFromDate:date];
// 2014/2/18 11:8:12

表記したいフォーマットパターンはData Formatting Guideに記されています
一部抜粋

OS X v10.9 and iOS 7 use version tr35-31.
OS X v10.8 and iOS 6 use version tr35-25.

日本語環境でのdateFormat

日本語の"日付と時刻"の設定で"24時間表示"というのがある
この設定がON/OFFの違いで24時間表示にした際の取得できる時刻が異なるので、注意が必要

NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 12時間表示
dateFormatter.dateFormat = @"yyyy/MM/dd hh:mm:ss";
NSString *date12 = [dateFormatter stringFromDate:date];
// 24時間表示
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSString *date24 = [dateFormatter stringFromDate:date];
24時間表示OFF
NSLog(@"%@", date12);
// 2014/02/18 11:08:12
NSLog(@"%@", date24);
// 2014/02/18 23:08:12
24時間表示ON
NSLog(@"%@", date12);
// 2014/02/18 11:08:12
NSLog(@"%@", date24);
// 2014/02/18 午後11:08:12

「午後」とか「午前」とか表示されてしまう
これはNSDateFormatterlocale.localeIdentifierja_JPであるのが原因である

NSDateで「午前/午後」表示させない

NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSString *defaultLocale = [dateFormatter stringFromDate:date];
// dateFormatter.locale.localeIdentifier:ja_JP defaultLocale:2014/02/17 午後11:35:44

dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSString *usLocale = [dateFormatter stringFromDate:date];
// dateFormatter.locale.localeIdentifier:en_US_POSIX usLocale:2014/02/17 23:35:44

データフォーマットのlocaleen_US_POSIXidentifierで上書きしてあげるだけでOK
こういう処理はいちいち入れるのではなく、NSDateクラスをカテゴライズした方が使いやすいかも

文字列(NSString)からNSDateに変換する

NSString *dateString = @"2014/02/17 23:15:46";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSDate *date = [dateFormatter dateFromString:dateString];
// 2014-02-17 14:15:46 +0000

注意
NSDate.dataFormatまたはsetDateFormat:を指定しないで文字列変換すると@""が返ってくる

日時を比較する

NSDate *date1 = [NSDate date];
NSDate *date2 = [NSDate date];
NSComparisonResult result = [date1 compare:date2];
switch(result) {
    case NSOrderedSame:
        // 同じ日時
        break;
    case NSOrderedAscending:
        // date1 < date2
        break;
    case NSOrderedDescending:
        // date1 > date2
        break;
}

日時を時間や分で比較する

NSString *before = @"2014/02/17 22:15:46";
NSString *after  = @"2014/02/17 23:17:49";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSDate *beforeDate = [dateFormatter dateFromString:before];
NSDate *afterDate  = [dateFormatter dateFromString:after];

NSTimeInterval sec = [afterDate timeIntervalSinceDate:beforeDate];
// sec:3723
int hour = (int)(sec / 3600);
// hour:1
int min  = (int)((sec - hour) / 60);
// min:62

timeIntervalSinceDate:を使うことで、日時の比較をおこなう

Sam
すまほあぷりえんじにーあ
http://d.hatena.ne.jp/samril/
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away