LoginSignup
blue-chicken
@blue-chicken

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

parse()メソッドで取得したdate型をカレンダー型へ変換できない

Q&AClosed

解決したいこと

標準入力で取得した文字列をparse()メソッドでdate型に変換いたしました。
変換したdate型をカレンダー型に変換したいのですが、カレンダー型に変換できません。
解決方法を教えていただけますと幸いです。
※動作環境はpaiza.IOとなります。

発生している問題・エラー

Main.java:32: error: cannot find symbol
        cal.setTime(date);
                    ^
  symbol:   variable date
  location: class Main
1 error

該当するソースコード

public class Main {
    public static void main(String[] args) {
        // Your code here!
       
        // 標準入力を取得(文字列)
        try{
            Scanner sc = new Scanner(System.in);
            String strdate = sc.next();
            System.out.println("文字列 = " + strdate);
        
            // 標準入力値をdate型に変換する
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            Date date = sdf.parse(strdate);
            System.out.println("Date型 = " + date);
            
        }catch (ParseException e) {
            e.printStackTrace();
            System.err.println("入力した日時のフォーマットが違います。");
            
        //カレンダー型に変換する
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
    }
  }
}

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

自分で試したこと

Date date = new Date(); で取得したdate型に関してはカレンダー型へ変換できました。

Stringからdate型へ変換したデータはカレンダー型に変換できないルールでもあるのでしょうか。
原因及び対処方法が分かりません。
ご指導ご鞭撻のほど宜しくお願いいたします。

0

1Answer

try文の中でDate date = sdf.parse(strdate);と変数の宣言をしているので、cannot find symbol(シンボルが見つけられない)となっているのだと思います。
また、catch文の中に

        //カレンダー型に変換する
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

が入ってしまっているので、{}をよく見直してみてください。

2Like

Comments

  1. @blue-chicken

    Questioner
    ご返信が遅くなり申し訳ございません。
    catch文へのご指摘誠にありがとうございます。
    修正いたしました。

    dateの宣言の件ですが、具体的にどのようにコードを書けば変換が可能なのでしょうか。
    setTime()の引数にDate型を選択するとカレンダー型に変換できる認識なのですが...
    ご確認宜しくお願いいたします。
  2. おっと、そこの説明から必要でしたか。

    try文の中で宣言した変数はtry文の中でしか使えません。
    (今は関係ないですが、if文とかfor文とかも同様)
    なので、try文の外で
    Date date;
    と宣言しておけば、try文の中でも外でも使えるようになります。
    (提示のコードでコンパイルが通っているのが不思議ですが…)

    また、この場合
    sdf.parse(strdate)
    が失敗等してdateがnullになる場合があるので、nullチェックを入れたりするのがベターかと思います。
  3. @blue-chicken

    Questioner
    朝早くからご返信いただきありがとうございます😭

    今から出勤するので、その後に時間見つけてコーディング開始します。
    コーディング終わり次第、返信させていただきます。
    ご確認宜しくお願い申し上げます。
  4. @blue-chicken

    Questioner
    お疲れ様です。
    この度は初歩的なところからご指導いただき誠にありがとうございます。
    アドバイス通りに修正して、無事に想定した反応を得ることができました。

    また、今後もより良いコードが書けるように練習していきます。

    この度はお忙しい中ありがとうございました。

Your answer might help someone💌