2つのNSDate間の年月日、時分秒をうるう年を考慮して算出する

2つのNSDate間の年月日、時分秒をうるう年を考慮して算出するお久しぶりです。

2つのNSDate間の年月日や、時分秒、年日など柔軟に取り出したかったのですが、これが自分で計算しようとすると結構面倒。最初は、NSTimeIntervalを出して、/60/60/24/365して年数を出して、秒数から年数を引いた値を/60/60/24して日数を出して。。。などやってましたが、このやり方すぐに破綻しますね。。うるう年考慮してないし、年月日をやりたいと思った時に、月の日数の算出のために別の方法を考えないといけない。

これやるためにいろいろ調べていたんですが、とあるサイトを確認した所、一瞬で解決しました。

NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *def = [cal components:NSYearCalendarUnit |
                              NSDayCalendarUnit |
                              NSHourCalendarUnit |
                              NSMinuteCalendarUnit |
                              NSSecondCalendarUnit
                                    fromDate:[NSDate date] toDate:toDate options:0];
    int year = [def year];
    int day = [def day];
    int hour = [def hour];
    int minute = [def minute];
    int second = [def second];

これですね。

あああー、って感じです。よくあるよくある!結局、iOS SDKの標準APIを見ていったほうが解決が早いっていう。

上記のメソッドでは当日からtoDate(NSDate)までの経過日数を年日時分秒で算出しています。結果として3年192日3時間4分5秒というような値が取得出来ます。もし、月を入れたければ、NSMonthCalendarUnitをcomponents引数のところに追加すれば、3年6ヶ月7日3時間4分5秒(日数は例として書きましたので正確ではありません)というように月数を考慮した日数を取得することが可能です。

このメソッドではうるう年も月数もカバーされていて、しかも、componentsの値を変えることで柔軟に値が取得できるので、ありがたいです。

そういうお話でした。

参考

Pocket
LINEで送る

You may also like...