まだNSDateで消耗してるの?
iPhoneアプリで日付の処理を行いたい場合、NSDateクラスを利用するわけですが、どうにも使いづらく感じてました。
そこで、「便利なライブラリが無いかな」と思って探していたところ、良さそうなのがあったので紹介したいと思います。(日本語の記事があまりなかったことですし。)
導入
こちらのgithubから導入します。おなじみのCocoaPodsでインストールしましょう。ライセンスは MIT License です。
色々と多機能なんですが、最低限のNSDateの拡張を使いたいだけなら
#import <NSDate+DateTools.h>
とソースコードにかけばokです。
機能
NSDate+DateTools, Time Periods, Time Period Groupsという3つの機能があるようなのですが、ここでは、NSDate+DateTools.hで利用できるメソッドを中心に紹介します。(Time Periods機能の方は、自分があまり利用していないこともあり...)
ヘッダファイルをみると、たくさんのメソッドが用意されていますが、ここでは代表的なものだけをご紹介します。
NSDate 生成
日付・時刻を指定して、NSDateを作ることができます。
NSDate *date = [NSDate dateWithYear:2015 month:6 day:1];
NSDate *datetime = [NSDate dateWithYear:2015 month:6 day:1 hour:11 minute:22 second:33];
NSDateの 年・月・日・時・分・秒
「NSDate の 年・月・日・時・分・秒 を求めたい」というのは、よくありがち。ですが、NSDateにはそれ用のメソッドはなく、NSDateComponentsを利用しなければなりません…。
それがDateToolsだと、簡単に書けます。
// 年月日
NSDate *date = [NSDate date];
date.year
date.day
date.hour
date.second
といった感じになります。
m日後、n年後などを求める
"dateByAddingYears”などの各種メソッドが用意されています。
NSDate *nextYear = [date dateByAddingYears:1];
NSDate *nextMonth = [date dateByAddingMonths:1];
NSDate *nextDay = [date dateByAddingDays:1];
当然ですが、年月が変わるような演算も全然okです。
日付比較
-(NSInteger)yearsEarlierThan:(NSDate *)date;
-(NSInteger)yearsLaterThan:(NSDate *)date;
などの各種メソッドが用意されています。
個人的には
// date == 今日
[date isToday]
が嬉しかったです。
※“2つのNSDateの年月日だけ合致している” といった比較は、できないのかな…。
注意点:和暦に対応するには
日付を扱うアプリを作ると、iPhoneの本体設定で「和暦」が選択されているときの対応でバグが起こりやすいです。
(私も何度か痛い目にあったことがあります…)
DateToolsライブラリを使用するときも、和暦対応には注意する必要があります。
date.year対応
まず、date.year は本体設定に関わらず、西暦が帰ってきます。本体設定に応じた値が必要な場合は、独自実装が必要です。
dateFromString対応
dateFromStringをオプションなしで使用する場合、本体設定に応じた「年」が返ってきます。本体が和暦なら、和暦の年数が得られます。
// 本体設定により、”年"が異なる
NSString* formattedDate = [date formattedDateWithFormat:@"yyyy-MM-dd HH:mm:ss"];
西暦が欲しい場合は、locale指定のメソッドを使用するとokです。
// “年”を西暦で出力
NSString* formattedDate = [dateformattedDateWithFormat:@"yyyy-MM-dd HH:mm:ss" locale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
まとめ:個人的には大助かりでした。
このライブラリだけで、日付処理の全てが解決するわけでは無いです。が、個人的にはNSDateクラスをとても扱い辛いと感じてたので、そこらへんのストレスはだいぶ改善されました。
今回紹介した以外のメソッドもたくさんあります。うまく組み合わせて使えば、開発がはかどると思います。