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

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

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

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

Q&A

解決済

5回答

6857閲覧

フォーマットしてDate型でreturnしたい

isacRu

総合スコア64

Java

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

0グッド

0クリップ

投稿2016/09/16 09:31

単純に現在の時刻をフォーマットしてDate型でreturnしたい。ほとんどのサイトを見てもString型でreturnするところが多く、自分の求めている情報がなかなか手に入りません。
一応自分でも試してみたのですが、結局ふつうのnewしたDate型の値しかreturnしてくれなくて困っています。

java

1import java.text.ParseException; 2import java.text.SimpleDateFormat; 3import java.util.Date; 4 5public class App { 6 7 public static void main(String[] args){ 8 System.out.println(currentDate()); 9 } 10 11 public static Date currentDate(){ 12 Date date = new Date(); 13 try { 14 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss"); 15 date = dateFormat.parse(dateFormat.format(date)); 16 } catch (ParseException e) { 17 e.printStackTrace(); 18 } 19 return date; 20 }

フォーマットしてDate型でreturnするにはどうすれば良いのかわかる方、教えてください。
以上、宜しくお願い致します。

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

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

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

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

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

swordone

2016/09/16 09:53

「フォーマットしてDateでreturn」というのがよくわかりません。sqlのDateとかと混同していませんか?
isacRu

2016/09/16 10:54

java.util.Dateで統一化しているので、問題ないかと思います。
swordone

2016/09/16 12:55

Dateはある時刻を表すlong値なので、フォーマットもなにもないと思うのですが…
退会済みユーザー

退会済みユーザー

2016/09/16 15:07

System.out.println(currentDate()); この表示は、たとえば、次のようになります。 Sat Sep 17 00:01:33 JST 2016 しかし、フォーマットは"yyyy/MM/dd kk:mm:ss"で表示したい。という質問ですか?
isacRu

2016/09/17 08:26

簡単にいえばyyyy/MM/dd kk:mm:ssでフォーマットしたいが、できないということです。
isacRu

2016/09/17 08:27

「Dateはある時刻を表すlong値」が理解できなかったです。どいういみですか?
guest

回答5

0

ベストアンサー

「フォーマットしてDateでreturn」の意味がわからないのですが、フォーマット付きでDate型を受け渡ししたいということでしょうか? つまり、 toString() のときのフォーマットを指定したい?
だとすると、以下のようなクラスを作ってはどうでしょう?

Java

1import java.text.SimpleDateFormat; 2import java.util.Date; 3 4public class DateWithFormat extends Date { 5 String format = "yyyy/MM/dd kk:mm:ss"; 6 public DateWithFormat(){ 7 } 8 // コンストラクタのパターンいろいろ・・・省略 9 10 // toString をオーバライトして指定したフォーマットで文字列化 11 public String toString() { 12 SimpleDateFormat dateFormat = new SimpleDateFormat(format); 13 return dateFormat.format(this); 14 } 15}

これを main から、

Java

1 System.out.println(new DateWithFormat());

とかすると、結果は "2016/09/16 20:26:51" みたいになり、かつ、返却値のオブジェクトに対して Date型のメソッドは使えます。

ただし、もし、こういうことがお望みだとすると、あまりおすすめできません。Date型とそれを文字列化するときのフォーマットは本来分離されているべきです。たまたま Date型の toString() の仕様が気に食わなかっただけで、クラスを追加するというのは本末転倒のように思います。

投稿2016/09/16 11:39

編集2016/09/16 11:45
mit0223

総合スコア3401

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

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

swordone

2016/09/19 04:24

そこだけで使うなら、匿名クラスで返してしまっていいと思います。
mit0223

2016/09/19 08:47

私がこの案をおすすめできないのは、例えば、何かバグが出てこのコードを別人が解析しなければならなくなったときに、つまらないユーティリティクラスのためにコードが分散するからです。「このクラスは何かな?バグには関係ないかな?」といってクラスのコードを確認する必要があるからです。もう一つ罪が重いのは、オーバライトによってコーディングが隠れる可能性があります。受け取る側が Date 型で参照していると、そこの toString() がオーバライトされてるかどうかは見た目ではわからなくなります。 匿名クラスでオーバライトとかになると、さらにステルス性が高まり、デバッグを難しくします。 昔 C++ でオーバライトが流行したときに演算子ごとにオーバライトされてないかビクビクしながらコードを読んでいたのを思い出しました。 オーバライトはそのデザインパターンが明示されているときに限ったほうが良いと思います。
swordone

2016/09/19 15:28

toString()のオーバーライド程度なら問題ないのでは?匿名クラスならコンストラクタを再定義する必要もないですし。
guest

0

java.util.Dateが何なのか知ろうともしないでフォーマットだなんだと的はずれなことばかり言っていることにそろそろ気づいて下さい。
これはエポック(1970 年 1 月 1 日 00:00:00 GMT)からの経過時間をミリ秒単位で保持するオブジェクトで、それ以上でもそれ以下でもありません。フォーマットとは一体なんのことを言っているのでしょうか?
あなたのコードは現在時刻のDateを生成して文字列化し、またそれをDateに解析しているだけなので、現在時刻しか出さないのは当然なのです。しいて言うなら秒未満が切り捨てられたことくらいでしょうか。しかしそれならCalendarを使ったほうが遥かに簡単です。

投稿2016/09/17 16:28

swordone

総合スコア20649

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

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

isacRu

2016/09/18 03:05 編集

ご回答ありがとうございます。回答を読んでいる限りだと、どうやら私の質問があまり理解されていないような気がします。私がいっているフォーマットとはnewしたDateの情報をフォーマット化(yyyy/MM/dd kk:mm:ss)にする、つまり不必要な情報を切り捨て、必要なDateの情報を取り上げるということです。
swordone

2016/09/18 04:05 編集

不必要な情報とは?逆に必要な情報とは? それと、 > どうやら私の質問が余り理解されてないような気がします。 それくらいトンチンカンな質問って事です。回答でも言いましたが、Dateは時刻をミリ秒で管理しており、年月日時分秒といった情報は持っていません。なので不必要な情報をDateから消すというのは不可能です。 「フォーマット」と言ってる時点で文字列の話のはずなのに、Date型で返すという質問が回答者全員を混乱させているのです。
isacRu

2016/09/18 05:28

不必要な情報とは?逆に必要な情報とは? >>new Date().toString()したときの文字列でyyyy/MM/dd kk:mm:ssとしてフォーマット化された文字列情報が必要です。つまり例でいえば「2000/09/01」といった形式の文字列情報が必要です。この言い回しで理解できますか?
guest

0

  1. 質問の解釈

質問の意図を次のように解釈しました。
System.out.println() の引数にDateのインスタンスを直接渡して、"yyyy/MM/dd kk:mm:ss”形式で表示させたい。

  1. Object.toString()

Stringを必要とする文脈でインスタンスを指定すると、暗黙のうちにObject.toString()が呼ばれる。
System.out.println() の引数にObjectを指定するとtoString()が呼ばれる。
System.out.println(new Date());
System.out.println((new Date()).toString()); // 上のコードは内部的にこのコードに変換される。
APIドキュメントの参照先:docs.oracle.com/javase/jp/7/api/java/lang/Object.html#toString()

  1. java.util.DateのtoString()

java.util.DateのtoString()はObjectのtoString()をオバーライドしている。
DateのtoString()のフォーマットは以下のとおり。
dow mon dd hh:mm:ss zzz yyyy
APIドキュメントの参照先:docs.oracle.com/javase/jp/7/api/java/util/Date.html#toString()

  1. 解決方法

java.util.Dateのサブクラスを定義しtoString()をオーバーライド。望みのフォーマットで日付を表示する。

//Dateのサブクラスの定義
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JPDate extends Date {

public JPDate() {super();} public JPDate(long millis) {super(millis);} @Override public String toString() { DateFormat format = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"); String formattedDate = format.format(this); return formattedDate; }

}

// 利用クラス
public class Application {
public static void main(String[] args) {
JPDate j = new JPDate();
System.out.println(j);
}
}

投稿2016/09/17 08:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/09/17 09:41

回答を投稿したら、すでにベストアンサーが投稿されてました。その投稿は昨夜だった。ありゃりゃーん。ビール飲も。えーと、その前に、toString()のオーバライドは理解してください。それからJava APIは読んでください。longについてのクイズ:System.out.println(new java.util.Date(0L));は、いつの日付でしょうか。
isacRu

2016/09/17 14:22 編集

ご回答本当にうれしく思います。toString()については理解できました。クラスをSystem.out.println()の中に格納したとき自動的にtoString()が自動生成される。しかし、今回指定してあらかじめtoString()オーバライドの中身を変えている。 System.out.println(new java.util.Date(0L));の出力結果について 結果は確かめたところ「Thu Jan 01 09:00:00 JST 1970」という出力結果でてきました。これはいったい何なのか疑問でした。値を2や3に変更しても同じ出力結果でした。意味を教えていただければ嬉しいです。
swordone

2016/09/17 14:07

コメント読もう。ドキュメントに説明があります。
isacRu

2016/09/17 14:16

まー、そんなこと言わずに。何がおかしいのか説明してくれよ。
退会済みユーザー

退会済みユーザー

2016/09/18 00:17

最後にいくつか質問します。答えは自分で考えてください。 質問1:なぜクイズの表示は、00:00:00でなく、09:00:00なのでしょうか。JSTや、GMTは? 質問2:負の値を指定するとどうなりますか? new Date(-1L)とかnew Date(-32400000L) 質問3: new Date(Long.MIN_VALUE)とnew Date(Long.MAX_VALUE)は正しいでしょうか? Java APIを読むことをお勧めします。勉強を続けてください。
isacRu

2016/09/18 01:06 編集

えー、ケチ。APIを読んでもそこまで細かいこと書いてないし、他のキーワードで検索して調べるしなかい。 質問1:なぜクイズの表示は、00:00:00でなく、09:00:00なのでしょうか。JSTや、GMTは? >>わからん!JSTとGMTはわかった(世界標準時と日本標準時) 質問2:負の値を指定するとどうなりますか? new Date(-1L)とかnew Date(-32400000L) >> new Date(-1L)の場合は「Thu Jan 01 08:59:59 JST 1970」、new Date(-32400000L)の場合は「Thu Jan 01 00:00:00 JST 1970」比べれば、-1になってるだけに見えるし特に意味がわからない。 質問3: new Date(Long.MIN_VALUE)とnew Date(Long.MAX_VALUE)は正しいでしょうか? >>そもそも正しいのか、正しくないのかわからない。 以上、自分で考えた結果です。
guest

0

直接的な回答ではないのですが、
API仕様書 java.util.DateのtoString()にあるように出力形式は決まってます。

Dateオブジェクトを次の形式のStringに変換します。

dow mon dd hh:mm:ss zzz yyyy

なので質問内容の「System.out.println(currentDate());」の結果は決まった書式になります。

単純に現在の時刻をフォーマットしてDate型でreturnしたい。

Stringをreturnしては都合が悪いのでしょうか?

投稿2016/09/16 11:24

java-beginner

総合スコア452

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

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

0

新しいフォーマッタを定義すれば目的は達成できるかと思います。

投稿2016/09/16 10:32

A-pZ

総合スコア12011

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

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

isacRu

2016/09/16 10:55

新しいフォーマッタの定義とはどういったものでしょうか?詳しく説明してくれると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問