LoginSignup
40
39

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:を使うことで、日時の比較をおこなう

40
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
39