質問: 日時情報を入力させて利用するアプリを作っています。 その日時を保持するのに使うのは、CalendarとDateどちらがいいんでしょうか? Dateは年月日時分秒を持つ型というイメージがあるのですが、 Calendarはインスタンスが1つしか作れないので、基本的に今を表すのに使うという認識は間違っていますか?
回答: すでに解決しているようですが、 そもそもの使い分けとどちらを使ったら良いのかを回答をしておきます。 まずはこの2つのjavaの歴史 **Date** 「特定の時点を表すもの。」 が、本来の「特定の時点を表すもの」であるのに可変なオブジェクトであるため時間を表すよりも時間の操作に主につかわれていましたので、Calendarができると同時にgetとsetを非推奨とし時間操作をこのオブジェクトに対して行われないように調整されました。 **Calendar** 「時間的操作のあるものを表すオブジェクト」 Dateが「特定の時点」を表すものであるのに対し、現実世界のカレンダーや時計などのように時間的操作のあるものを表すように調整されています。 私個人としては特定の時点を表す意味合いが大きい変数には「Date」を、変化する時間を表すものに対しては「Calendar」を使っていました。 (また、いろいろなコストが高いCalendarは特定の時点をあらわすのには不向きです。new Date()とgetInstance()をループ処理内に作ると改善されていっているとはいえ明らかに動作スピードが変わります。) と、言ってますが、long値を直接使ってました。下記のjava.timeパッケージ群を使わないなら実はおすすめだったりww ### 以下Androidでは採用されていないパッケージのため、質問と関係ない部分です。 勘違いして記入してました。 (将来的にはわかりませんが) 実はjava8でDateの次のデメリットを改善するパッケージ郡が作られています。 1. そもそも可変オブジェクトである。 オブジェクト変数にDateを使用していると、思ってもいない部分で変更されていたのに気づきにくく外部で変更することができてしまう。 2. 特定の時点を表しているはずなのにタイムゾーンの違うところでは時差を意識し無くてはならない。 基本的に世界標準時にて表しているのだが表示する際はタイムゾーンを意識して使用しなくてはならなく、意識しずに作ることも可能だが本来の意味合いが薄い。 3. Calendarがあるとはいえ時間量の操作がめんどい そもそも、時間量を表すオブジェクトではないため3日と3時間を足すためには操作が2度、3度あったりする。 4. 使用したオブジェクトにおけるメソッドの引数がプリミティブ型となり間違って使っても気づきにくいし、それぞれ作らなければならない. 例えばadd(int y,int m,int d,int h,int mi,int s)とか引数の多いものを作らなくてはならなかったり、setTime(int hour,int minute,int second)に入れるhourに16を入れ無くてはならないのに4を入れたり。 5. その他 「日付だけを表したいのに・・・」「時間だけを表したいのに・・・・」「・・・バグあるやん」などなど で、作られたのが **java.timeパッケージ群** 「時間の概念をそれぞれ作ってみた」 DateやCalendarの様々な不満点を吸収するために、基本的に不変なオブジェクトとしてそれぞれが機能するクラスがあります。 「特定の時点をあらわすInstant」 「日付のみを表すLocalDate」 「時間のみを表すLocalTime」 「日付と時間を表すLocalDateTime」 「時差付日付と時間のoffsetDateTime」 「時差付時間のoffsetTime」 「年のみを表すYear」 などなど・・・ また「時間量」を表すオブジェクトが作られています。 「日付単位の時間量を表すPeriod」 「秒、ナノ秒単位の時間量を表すDuration」 前述のメソッドの引数にこれらを指定しておけば使用する際何を入れているのか明確になります。 (使用時の負担を強いるかわりに間違いが減ります) 現在のやりたいことからみてこれらのパッケージ群を使用してみては? まぁ、少し覚えなければならないこともありますが、 覚えておいて損はないとおもいますよ。