質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

Android 日時情報の保持 Calendar,Dateの使い分け

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,137

akamakku

score 193

日時情報を入力させて利用するアプリを作っています。
その日時を保持するのに使うのは、CalendarとDateどちらがいいんでしょうか?

Dateは年月日時分秒を持つ型というイメージがあるのですが、
Calendarはインスタンスが1つしか作れないので、基本的に今を表すのに使うという認識は間違っていますか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

保持するならどちらでも無く、UNIX時間(long値)がいいですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 10:04

    そうします!

    キャンセル

checkベストアンサー

0

CalendarはCalendar.getInstance()で何度でもインスタンス作成できますよ。別にシングルトンであるわけではないので。
そして年月日時分秒を設定して今以外のある日時を表すことは可能です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 10:04

    newでインスタンス生成しないから、1つのインスタンスを呼んでるだけだと思ってました!
    ありがとうございます

    キャンセル

  • 2016/05/20 10:04

    あと、一応clone()で複製も可能です。

    キャンセル

0

すでに解決しているようですが、
そもそもの使い分けとどちらを使ったら良いのかを回答をしておきます。

まずはこの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」
前述のメソッドの引数にこれらを指定しておけば使用する際何を入れているのか明確になります。
(使用時の負担を強いるかわりに間違いが減ります)

https://docs.oracle.com/javase/jp/8/docs/api/index.html?java/time/package-summary.html

現在のやりたいことからみてこれらのパッケージ群を使用してみては?
まぁ、少し覚えなければならないこともありますが、
覚えておいて損はないとおもいますよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 12:11

    すばらしいです。
    これを求めてました!
    ありがとうございます!

    キャンセル

  • 2016/05/20 12:28

    どういたしまして
    現在のDateのデメリットを一つ追加しましたので参考までに。

    キャンセル

  • 2016/05/20 12:40

    あ、これAndroidの質問ですね。
    失礼しました。Date,Calendarの部分が含まれているためその部分を・・・(汗)
    androidでしたら「android.text.format.Time」というのもあります。
    使ったことありませんのでわかりませんが、なんとなくtoString経由でいろいろなことをするために使うのかな・・・ごめんなさいわかりません。

    キャンセル

  • 2016/05/20 12:42

    java.timeパッケージ群はAndroidではまだ使えないですね・・・
    AndroidNでJava8の一部機能が使えるようになりますが、
    java.timeパッケージ群は追加の対象になっていないようです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る