Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Dateについて

こんばんわ
前日はわかりづらい質問をして申し訳ありませんでした。
おかげ様で解くことができました。

すみませんが、また解けない問題に遭遇しました。
またDateについてなんですが、
public Date parse(String str){
}
というインスタンスメソッド(引数strの文字列をDate型に変換するというメソッド)を作るとします。

自分で考えたコードは

package名:Test

public Date parse(String str){
  try{
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
     cal.setTime(sdf.parse(str));
     Date dd = ?;
     return dd;
  }catch(Exception x){
     return null;
  }
}
となったのですが、戻り値がDate型ですのでDate型で値を返さなくてはなりません。?の部分にいろいろ入れてみたのですが、「java.util.DateをTest.Dateに変換することはできません」というコンパイルエラーがでます。上のプログラムはどこが間違っているのでしょうか?それとも一から考え直した方が良いのでしょうか?
御教授よろしくお願い致します。

14

回答

4975

閲覧

14件の回答

評価

0

クラスのなかで、日付を持ったものをDateにして返す、ということで良いのではないかと。
作りは間違っていないと思います。

>いろいろ入れてみたのですが、
というのと
>「java.util.DateをTest.Dateに変換することはできません」
というのは、前者が複数・後者が1つなので、どうかと思います。
(何を入れてもこのメッセージが出る、ということはないはずです)
後者のメッセージが出たときに入れたものを、出してみてください。

評価

0

申し訳ありませんが、後者のメッセージ(Test.Date)が出たときに入れたものを出すことがわからないのです。すみませんがそこのところを御教授お願い致します。初歩的な質問で申し訳ありません。

評価

0

>そこのところを御教授
エラーが出るようにしたいんですか?
もしかして誤解されたかも知れませんが、「出して」というのは、
「この掲示板に書いて」ということです。

エラーになって、その解決法を知りたいのであれば、
エラーになった時点のコードを、掲示するようにしてください。
読む側では、なにをやってエラーになったのか、ふつうは分かりません。

評価

0

?の部分にcal.getTime()と入れると「java.util.DateをTest.Dateに変換することはできません」とエラーが出てしまいます。cal.getTime()でparseした時刻を取得できると思ったのですが、自分は勘違いをしていますか?

評価

0

>cal.getTime()でparseした時刻を取得できる
できます。
が、その値をreturnするのには、ちょっと問題があります。
クラス名がDateなので、public Dateというメソッドの宣言は、自分の型(Test.Date)ということになります。
そうすると、自分はutil.Dateでもutil.Dateを継承したクラスでもないので、変換できない、ということになります。
メソッドの戻り型がどのパッケージのDateなのか、明示してやる必要があります。

一般的に、機能をリプレースするのでない限り、基本パッケージにある名前は使うべきではないです。
このような混乱の元になります。

評価

0

>基本パッケージにある名前は使うべきではない
とありますが、この例で基本パッケージを使わない方法
とはどのようなものがあるのでしょうか?

評価

0

基本パッケージを使わないのではなく、基本パッケージにある名前を使わない、です。

評価

0

すみません。質問し直します
この例で基本パッケージにある名前を使わない方法
とはどのようなものがあるのでしょうか?

評価

0

?の部分にnew Date(cal.getTime())と
入れたら上手く行きました。
Test.Date型のインスタンスにcal.getTime()
を入れれば、このインスタンスはTest.Date型ですので、
return可能になるということを納得しました。
mioさんの投稿が参考になりました。
ありがとうございました。

評価

0

このクラスの名前を、たとえば"MyDate"などにして、"Date"でなくする、ということです。

解ですが…ちょっと違うように思います。
たとえば、
Test.Date date1 = ???;
Test.Date date2 = date1.parse(???);
として、date1に1日足したとき、date2には変化がありません。
新しいインスタンスを返すというのは、目的とは異なるのではないでしょうか。
そのようなメソッドなら、staticメソッドにすべきです。

このインスタンスに値を入れたいだけなら、thisを返せば目的は達成できます。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
cal.setTime(sdf.parse(str));
return this;

のような感じでしょう。

SimpleDateFormatの書式もparseメソッドの引数にしてやれば、汎用性が高まりますね。

評価

0

ありがとうございました。解けました。
しかしまた新たな問題に直面しました。
strの文字列"yyyy/MM/dd HH:mm:ss"と"yyyy/MM/dd"の
両方を同じメソッド内で日付に変換したいのですが
try・catchを使わなくてはならないので、
returnしてしまうと2つ目の処理が到達不能になってしまいます。
説明が下手なのでコードを乗せます。
このような場合"yyyy/MM/dd"形式の日付をフォーマットしたくても
"yyyy/MM/dd HH:mm:ss"形式のtryで例外(catch)に行き
nullが返されてしまいます。
"yyyy/MM/dd"形式の日付をフォーマットしたい場合"yyyy/MM/dd HH:mm:ss"のtry内でreturnせずに、下のtryに行く方法はないのでしょうか?
わかりづらい説明で申し訳ありません。
御教授よろしくお願い致します。

    try{
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
         cal.setTime(sdf.parse(str));
         return this;
    }catch(ParseException x){
        return null;
    }
    try{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        cal.setTime(sdf.parse(str));
        return this;
    }catch(ParseException x){
        return null;
    }

評価

0

もしあなたがどこかの社員で、この仕事が急務なら上司に相談して解決するべきです。
単に個人的に勉強しているだけで、特に答えを急がないなら、このサイト「Javaの道」を1から読み直す事をお勧めします。

評価

0

ご指摘ありがとうございます。
Javaの道読み直します

評価

0

そうですね…。構造化という段階でも、考えることができていなさそうです。
みんな通ってきた道なので、焦らずにじっくりと、基礎を固めてみましょう。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。