2010年 12月 25日(土曜日) 11:32

日付・時刻・カレンダー関連のよく使う処理

評価:
(0 票)

Cocoaで日付と時刻、カレンダー関連でよく使う処理をまとめておきます。

NSDateオブジェクトから、UNIXタイムスタンプを取得する。NSTimeIntervalはdoubleとして定義されているみたい。

    NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
    NSLog(@"%f", timestamp);

実行結果:

1293247007.415029

NSDateオブジェクトから日付と時刻を表す文字列を取得する。

    NSDate *date = [NSDate date];
    NSString *desc = [date descriptionWithLocale:[NSLocale currentLocale]];
    NSLog(@"%@", desc);

実行結果:

2010年12月25日土曜日11時58分51秒 日本標準時

フォーマットを指定したい場合は、NSDateFormatterクラスを使います。

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"Y/M/d H:m:s"];  
    NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];
    NSLog(@"Date: %@", dateString);

実行結果:

Date: 2010/12/25 11:55:36

逆に、文字列からNSDateオブジェクトを取得する。日付を表す文字列が、NSDateFormatterに設定されたdateFormatに一致していないとダメみたい。

日付のフォーマットは、ICUのDate/Time Formatに従って記述します。

    NSString *dateStr = @"2010/12/25 12:00:00";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"Y/M/d H:m:s"];  
    NSDate *date = [dateFormatter dateFromString:dateStr];
    NSLog(@"%@", [date descriptionWithLocale:[NSLocale currentLocale]]);

実行結果:

2010年12月25日土曜日12時00分00秒 日本標準時

NSDateオブジェクトから、今日の日付や月、年を取得する。

    NSDate *current = [NSDate date];
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *comps = [cal components:unitFlags fromDate:current];
    int year = [comps year];
    int month = [comps month];
    int day = [comps day];
    NSLog(@"Year: %d, Month: %d, Day: %d", year, month, day);

実行結果:

Year: 2010, Month: 12, Day: 25

今日の始まりと終わりのNSDateオブジェクトを取得する。

    NSDate *current = [NSDate date];
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *comps = [cal components:unitFlags fromDate:current];
    NSDate *beginningOfToday = [cal dateFromComponents:comps];
    [comps setHour:23];
    [comps setMinute:59];
    NSDate *endOfToday = [cal dateFromComponents:comps];
    NSLog(@"\ncurrent: %@, \nbeginningOfToday: %@, \nendOfToday: %@",
          [current descriptionWithLocale:[NSLocale currentLocale]],
          [beginningOfToday descriptionWithLocale:[NSLocale currentLocale]],
          [endOfToday descriptionWithLocale:[NSLocale currentLocale]]);

実行結果:

current: 2010年12月25日土曜日11時31分36秒 日本標準時, 
beginningOfToday: 2010年12月25日土曜日0時00分00秒 日本標準時, 
endOfToday: 2010年12月25日土曜日23時59分00秒 日本標準時

ローカライズされた月の表記を表示する

    // NSCalendarから月を表す数字を取得する。
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *comps = [cal components:unitFlags fromDate:[NSDate dateWithTimeIntervalSince1970:pointTime]];
    int month = [comps month];

    // NSCalendarからだけでは表記は取得できないみたいなので、NSDateFormatterを使う
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    // 欲しい表記の長さに応じて使い分けられる
    NSArray *monthSymbols1 = [dateFormatter monthSymbols];
    NSArray *monthSymbols2 = [dateFormatter shortMonthSymbols];
    NSArray *monthSymbols3 = [dateFormatter standaloneMonthSymbols];
    NSArray *monthSymbols4 = [dateFormatter veryShortMonthSymbols];
    NSArray *monthSymbols5 = [dateFormatter veryShortStandaloneMonthSymbols];

    NSLog(@"monthSymbols: %@", [monthSymbols1 objectAtIndex:month - 1]);
    NSLog(@"shortMonthSymbols: %@", [monthSymbols2 objectAtIndex:month - 1]);
    NSLog(@"standaloneMonthSymbols: %@", [monthSymbols3 objectAtIndex:month - 1]);
    NSLog(@"veryShortMonthSymbols: %@", [monthSymbols4 objectAtIndex:month - 1]);
    NSLog(@"veryShortStandaloneMonthSymbols: %@", [monthSymbols5 objectAtIndex:month - 1]);

iOSの設定で、言語環境の書式を「日本」にしたときの実行結果:

monthSymbols: 12月
shortMonthSymbols: 12月
standaloneMonthSymbols: 12月
veryShortMonthSymbols: 12
veryShortStandaloneMonthSymbols: 12

iOSの設定で、言語環境の書式を「英語(アメリカ合衆国)」にしたときの実行結果:

monthSymbols: December
shortMonthSymbols: Dec
standaloneMonthSymbols: December
veryShortMonthSymbols: D
veryShortStandaloneMonthSymbols: D

iOSの設定で、言語環境の書式を「中国語(中国)」にしたときの実行結果:

monthSymbols: 12月
shortMonthSymbols: 12月
standaloneMonthSymbols: 十二月
veryShortMonthSymbols: 12月
veryShortStandaloneMonthSymbols: 12月

月の他に、曜日の表記はweekdaySymbols、四半期の表記はquarterSymbolsで取得できる。

他にも使うことがあったら、ちょっとずつ追記していきます。

最終更新日: 2011年 6月 27日(月曜日) 01:13
くらち たかよし

くらち たかよし

モバイル・Webアプリ作家。最近は主にiPhoneアプリ制作を手がける。企画から、UIデザイン、設計、実装、テスト、多言語対応、ユーザーサポートまでを1人〜数人の個人で行う全人的開発手法の確立を目指している。

使う言語はObjective-C, C++, C#, Java, PHPなど。Web関連で使うものはCakePHP, MySQL, Joomla! CMSなど。デザインはシロウトながらPhotoshopとIllustratorをなんとかがんばって使う。

場所や時間に縛られない、インターネット時代の新しい働き方、自由な生き方を模索中。海外移住、低予算&低リスク起業、キャリアデザイン、心理学などにも興味あり。

Web: awaresoft.jp/