update.はじめに日付操作とか比較とかしようとか思ってググると、NSDateComponentsを使ったやつがよく出てきます。NSDateComponentsを作ってから一つの要素ごとに足し算したりとか色々めんどいなーと思ってリファレンス見てたら、日付操作とか日付比較で便利なメソッドがNSCalendrに追加されていることに気づきました!introduced=8.0って書いてあるからiOS8からなのかなと思ったんですが、どうなんでしょう。iOS8からっぽいやつを試してみました。全体を通してですが、NSCalendarは西暦を使用します。currentCalendar()使っちゃうと和暦が設定されてると困るみたいです。2014年12月10日20時26分を生成するには、dateWithEraを使います。20:26:00dateWithEraのeraってなんだろうと思ったんですが、紀元前(BC)、紀元後(AD)のことだそうです。紀元前は、0、紀元後は1なので、1を指定しています。ちなみに、和暦の場合はここが、なんか色んな値になるっぽいコメントがありました。dozens.時刻だけを変更したものを生成NSDateオブジェクトの時刻だけを変えたいってときは、dateBySettingHourを使います。さっきのやつの時刻だけを変えるにはこうする。指定して加減算できます。さっき生成した日付の10日前はこんな感じ。08:30:00分だけを足し算するにはこう。.MinuteCalendarUnitを指定する。08:45:00わざわざNSDateComponentsを作って足し算引き算しなくてすむようになったので便利ですね。日付要素の取得componentってメソッドがあるので好きな要素だけをとれます。時だけが欲しいときは、こうやります。8各要素をまとめてとりたい時用のAPIもあるんですが、参照渡しで値を取得するってやつで、なんか使い方が直感的じゃない気がする。(とりあえずタプルでとってみたけどタプルじゃなくてもできます。同じ日付かどうかisDateが比較用のAPIなんですが、日付が同じかどうかと一口で言っても、同じ年か、同じ月かという個別に判断したい場合もありますよね。いうときにも、細かく指定できるようになってます。8:30が年が一緒か、月が一緒かチェックしたい場合はこう書きます。これは結構使いやすいんじゃないかなー。NSDate)があります。2014/12/10と2014/11/30は違う日なのでfalse調べたい日付が、今日なのか、明日なのか、週末なのかも用意されてます。この辺はカレンダーとか作る場合に使うかもしれないですね。11月30日は日曜日なのでtruecalendar.isDateInWeekend(date2014_11_30_0845)日付の前後/大小の比較これは、beforeとかafterとかって名前がついたAPIがあったらいいなというところでしたが、残念ながらいつものNSComparisonResultが返ってくるやつしかないっぽいです。どこまで比較するかってのを指定できるようになってて、例えばこんなことができます。20:26を日にちまでの部分だけで比較するためには、.DayCalendarUnitを指定します。日にちまでは同じなので比較する順番を入れ替えても.OrderedSameが返ってきます。.OrderedSameそして、MinuteCalendarUnitを指定すれば分のところまでで比較されるので、どっちが先か後かが返ってきます。.OrderedDescendingおしゃれなメソッドはないけど、比較したい要素を指定できるので使い勝手はよくなってると思います。謎のAPIAPIのドキュメントも読んだんですがなんとなく使い道がイメージできなかったやつたちです。使い方も理解するのに時間がかかった。nextDateAfterDate次のマッチする日付を探索します。次の13日はいつ?というのを調べます。今日が12/11だとしたら、12/13がかえってきます。今日が12/14だとしたら、1/13がかえってきます。うーん何かに使えるのかな。あと、NSCalendarOptionsの詳しい説明がリファレンスに書いてなくて各値が何を表すのかが分からないです。カレンダーを探索するときに使えそうな雰囲気ではあるんだが。rangeOfWeekendStartDateそして、一番謎だったAPIがこれ。NSDate)使い方と使い道が分からないんだけど、なんとか使い方は理解できました。この参照渡し系のやつってなんとかならんのか。要は、containingDateが週末かどうかをチェックしてくれるんだけど、参照渡しで、datepとintervalを渡しておくと週末の始まりの日付と週末の期間の長さをセットしてくれるというAPI。この週の週末は2日間だからintervalには、`60*60*24*2=172800`がセットされているうーん、何に使うんだろうか・・・きっとスケジュールアプリとか作ってる人は使い道がぱっと思いつくんだろうな。まとめNSDateの操作は他の言語に比べて直感的な操作ができるものが長らく用意されてなかったけど、iOS8ぐらいから少しずつ手を入れていくつもりなんでしょうか。Javaだってずっと辛い感じだったけど8になってようやく使いやすいAPIが出てきたぐらいだし、なんかそんなもんなんでしょうか。あと、日付生成系はほとんどNSDate?を返すので今回は説明用に!でアンラップしてますが、本当はチェックしてから使用する必要があるあたりはちょっと面倒かもしれません。upLoginユーザーは見つかりませんでした。