酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSでNSDateから曜日を取得する

NSDateから曜日を取得する必要が出てきました。このプロダクトでは曜日を取得する処理はほとんど要らないんだけど、他のプロジェクトでも使えるようにNSDateを拡張してカテゴリで実装してみました。あとはこのソースコードを取り込めばNSDateの拡張機能が使えるという寸法。

しかし、NSString型からNSDate型への変換とその逆パターンでNSDateFormatterの同じ処理が山のようにあるんだけど、もうちょっとなんとかした方が良いな……。課題票にあげておこう。

NSDateから曜日を取得する

NSDate+Softbuild.h

#import <Foundation/Foundation.h>

@interface NSDate (Softbuild)
// 曜日のインデックス値を取得する
- (NSInteger) weekday;
// 短い曜日(例:火曜日ならば火など)を取得する
- (NSString*) stringShortweekday;
@end

NSDate+Softbuild.m

#import "NSDate+Softbuild.h"

@implementation NSDate (Softbuild)

/*****************************************************
 * 曜日のインデックス値を取得する
 * @return 曜日のインデックス値(1を日曜日とした値)
 *****************************************************/
- (NSInteger) weekday {
    NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents* comps = [calendar components:NSWeekdayCalendarUnit fromDate:self];
    return comps.weekday;
}

/*****************************************************
 * 短い曜日(例:火曜日ならば火など)を取得する
 * @return 曜日
 *****************************************************/
- (NSString*) stringShortweekday {
    static NSString* const array[] = {nil, @"日", @"月", @"火", @"水", @"木", @"金", @"土"};
    NSInteger index = [self weekday];
    if (index > 7) index = 0;
    return array[index];
}

@end

使い方

// 2012/3/27(火)のNSDateを取得する
NSDate* today = [NSDate date];
// "火"など短い曜日名称を取得する
NSString* week = [today stringShortweekday];