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

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

ただいまの
回答率

88.79%

Javaでカレンダーを作りたいです

受付中

回答 3

投稿

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

solz

score 12

前提・実現したいこと

1,キーボードで"yyyy/MM"の形式で年と月を入力
2,yyyy/MMで入力された数字をyyyy/MMで出力

現在は入力する際、
yyyy
MM
のような形で入力する方法しかわからない状態です、
キーボードでyyyy/MMの形式で入力する方法で何かいいやり方はありませんでしょうか。

また、2点目ですが、キーボードからMM(例:03)と入力しても
頭に0か付かずに出力されてしまいます。
こちらも解決法を教えて頂けると幸いです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

package calendar;

import java.util.Calendar;
import java.util.Scanner;


public class Mycalendar {

    public static void main(String[] args) {
        java.util.Calendar cal = java.util.Calendar.getInstance(); 

        System.out.println("カレンダーを表示したい年月をYYYY/MMで指定してください");

        Scanner scan = new Scanner(System.in);
        int year = scan.nextInt();
        int month = scan.nextInt();

        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ) {
             System.out.println(" ");
               System.out.println(year + "/" + month + "(うるう年)");
               System.out.println(" ");
               System.out.println("日 月 火 水 木 金 土");
               System.out.println("---------------------");

        } else {
             System.out.println(" ");
                System.out.println(year + "/" + month);
                System.out.println(" ");
                System.out.println("日 月 火 水 木 金 土");
                System.out.println("---------------------");
        }

        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month -1);
        cal.set(Calendar.DATE, 1);

        int week = cal.get(java.util.Calendar.DAY_OF_WEEK);
        int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);

        int counter = 0;

        for (int i = 1; i < week ; i ++) {
            System.out.print("   ");
            counter ++;

        }
            for (int day = 1 ; day <= lastDay; day ++) {
                if (day < 10) { // ズレ
                System.out.print(" " + day + " ");
                } else {
                System.out.print( day + " ");

            }
            counter ++;

            if (counter == 7) { // 7日ごとに下段に

            counter = 0;
            System.out.println();
            }
        }
    }
}

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/05/07 15:03

    タイトルは質問要件(起きている問題)に寄せてください。

    キャンセル

回答 3

0

nextIntメソッドの場合、入力したトークンを整数で取得してしまうので、

"yyyy/MM"の形式

で取得したい場合はnextメソッドで文字列を取得してください。

2点目ですが、キーボードからMM(例:03)と入力しても頭に0か付かずに出力されてしまいます。

intは整数型なので、先頭に0はつけられません。
やはりこちらも文字列にして取得しなければいけません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/07 14:43

    回答ありがとうございます。
    メソッドの問題だったのですね。理解が足りていなかったです、試してみます。

    キャンセル

0

キーボードでyyyy/MMの形式で入力する方法で何かいいやり方はありませんでしょうか。

一行丸々読み込んでからスラッシュで分割し、それぞれ数値化すれば良いです。
次のメソッドについてそれぞれ調べてみると良いでしょう。

  • Scanner#nextLine
  • String#split
  • Integer.valueOf

2点目ですが、キーボードからMM(例:03)と入力しても
頭に0か付かずに出力されてしまいます。

数値化した時点で不要な情報は削ぎ落とされているのです。

System.out.printfを使うと便利です。
例えば0埋め2ケタの数値なら、次のように使います。

System.out.printf("%02d", day);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/07 14:44

    回答して頂きありがとうございます。
    メソッドについて、調べてみます。当方初心者の為、なぜ0が消えるのかも知らなかったので
    知ることが出来てよかったです。

    キャンセル

0

Scanner には, 分割するパターンを指定できる useDelimiter があります.

package calendar;
import java.util.Calendar;
import java.util.Scanner;
import static java.util.Calendar.*;

public class Mycalendar {
  public static void main(String[] args) {
    System.out.println("カレンダーを表示したい年月をYYYY/MMで指定してください");

    Scanner scan = new Scanner(System.in).useDelimiter("/");
    int year = scan.nextInt();
    int month = scan.nextInt() - 1; //月は 0 始まりとする

    Calendar cal = Calendar.getInstance();
    cal.set(YEAR, year);
    cal.set(MONTH, month);
    cal.set(DATE, 1);

    System.out.println();
    System.out.println(year + "/" + (month+1) + (((java.util.GregorianCalendar)cal).isLeapYear(year)?"(うるう年)":"") );
    System.out.println();
    System.out.println("日 月 火 水 木 金 土");
    System.out.println("---------------------");

    cal.add(DATE, SUNDAY-cal.get(DAY_OF_WEEK)); //1日が属する週の日曜日の日付. ex)2019/5/1→2019/4/28
    for (; cal.get(MONTH) <= month; cal.add(DATE, 1)) {
      System.out.printf(cal.get(MONTH)<month?"   ":"%2d ", cal.get(DATE));
      if (cal.get(DAY_OF_WEEK) == SATURDAY) System.out.println();
    }
  }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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