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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

1722閲覧

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

akamakku

総合スコア191

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1グッド

0クリップ

投稿2016/05/20 00:53

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

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

RyotaKondo👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2016/05/20 00:59

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2016/05/20 01:04

そうします!
guest

0

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

まずはこの2つのjavaの歴史

Date
「特定の時点を表すもの。」
が、本来の「特定の時点を表すもの」であるのに可変なオブジェクトであるため時間を表すよりも時間の操作に主につかわれていましたので、Calendarができると同時にgetとsetを非推奨とし時間操作をこのオブジェクトに対して行われないように調整されました。

Calendar
「時間的操作のあるものを表すオブジェクト」
Dateが「特定の時点」を表すものであるのに対し、現実世界のカレンダーや時計などのように時間的操作のあるものを表すように調整されています。


私個人としては特定の時点を表す意味合いが大きい変数には「Date」を、変化する時間を表すものに対しては「Calendar」を使っていました。
(また、いろいろなコストが高いCalendarは特定の時点をあらわすのには不向きです。new Date()とgetInstance()をループ処理内に作ると改善されていっているとはいえ明らかに動作スピードが変わります。)

と、言ってますが、long値を直接使ってました。下記のjava.timeパッケージ群を使わないなら実はおすすめだったりww

###以下Androidでは採用されていないパッケージのため、質問と関係ない部分です。
勘違いして記入してました。
(将来的にはわかりませんが)


実はjava8でDateの次のデメリットを改善するパッケージ郡が作られています。
0. そもそも可変オブジェクトである。
オブジェクト変数にDateを使用していると、思ってもいない部分で変更されていたのに気づきにくく外部で変更することができてしまう。
0. 特定の時点を表しているはずなのにタイムゾーンの違うところでは時差を意識し無くてはならない。
基本的に世界標準時にて表しているのだが表示する際はタイムゾーンを意識して使用しなくてはならなく、意識しずに作ることも可能だが本来の意味合いが薄い。
0. Calendarがあるとはいえ時間量の操作がめんどい
そもそも、時間量を表すオブジェクトではないため3日と3時間を足すためには操作が2度、3度あったりする。
0. 使用したオブジェクトにおけるメソッドの引数がプリミティブ型となり間違って使っても気づきにくいし、それぞれ作らなければならない.
例えばadd(int y,int m,int d,int h,int mi,int s)とか引数の多いものを作らなくてはならなかったり、setTime(int hour,int minute,int second)に入れるhourに16を入れ無くてはならないのに4を入れたり。
0. その他
「日付だけを表したいのに・・・」「時間だけを表したいのに・・・・」「・・・バグあるやん」などなど

で、作られたのが
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 03:05

編集2016/05/20 03:45
RyotaKondo

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2016/05/20 03:11

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

2016/05/20 03:28

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

2016/05/20 03:40

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

2016/05/20 03:42

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

0

ベストアンサー

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

投稿2016/05/20 01:01

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2016/05/20 01:04

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

2016/05/20 01:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問