13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NSDateを扱いやすくする「DateTools」ライブラリを使ってみた

Last updated at Posted at 2015-06-15

まだ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クラスをとても扱い辛いと感じてたので、そこらへんのストレスはだいぶ改善されました。

今回紹介した以外のメソッドもたくさんあります。うまく組み合わせて使えば、開発がはかどると思います。

13
14
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
13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?