0

入力された年がうるう年で有効な日付かどうかを判断するプログラムを Java で作成する予定です。その日付を取得して、完全な名前 (2013 年 4 月 2 日 = 2013 年 4 月 2 日) に変換し、その年の数字 (2013 年 4 月 2 日 = 92 日目) を特定します。

1つまたは別のプログラムがたくさんありますが、可能であればすべてを1つに組み合わせる方法について学んだり、アイデアを得たりしています。

うるう年を確認するために、これは私が使用したものです:

public class LeapYear {
    public static void main (String[] args) {
    int theYear;
    System.out.print("Enter the year: ");
    theYear = Console.in.readInt();
    if (theYear < 100) {
        if (theYear > 40) {
        theYear = theYear + 1900;
        }
        else {
        theYear = theYear + 2000;
        }
    }
    if (theYear % 4 == 0) {
        if (theYear % 100 != 0) {
        System.out.println(theYear + " is a leap year.");
        }
        else if (theYear % 400 == 0) {
        System.out.println(theYear + " is a leap year.");
        }
        else {
        System.out.println(theYear + " is not a leap year.");
        }
    }
    else {
        System.out.println(theYear + " is not a leap year.");
    }
    }

}

月と日も読み取るには少し変更する必要があることに気付きましたが、この場合は年を確認するだけです。入力した同じ日付を完全な名前に変換するにはどうすればよいですか? 次のような if ステートメントを作成する必要がありますか。

if (theMonth == 4){
     System.out.println("April");
         if (theDay == 2){
          System.out.print(" 2nd, " + theYear + ".");
         }
    }

それは多くのハードコードされた作業のようです。次のようなものを取得できるように、必要なハードコーディングの量を制限しようとしています。

Output:
 Valid entry (4/2/2013).
 It is April 2nd, 2013.
 It is not a leap year.
 It is day 92.

無効な日付などのエラーが発生した場合、プログラムを実行するのではなく、有効なエントリが受信されるまでプログラムがユーザーに再プロンプトを表示するようにします (「Quit」の書き込み中にプログラムが終了します)。

メイン メソッド (日付の取得) 用にさまざまなクラスを作成し、うるう年かどうか、Conversion メソッド、そしておそらく検証メソッドを確認するだけでよいと思います。

4

3 に答える 3

1
public void testFormatDate() throws ParseException {
        final String[] suffixes =
                //    0     1     2     3     4     5     6     7     8     9
                { "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
                        //    10    11    12    13    14    15    16    17    18    19
                        "th", "th", "th", "th", "th", "th", "th", "th", "th", "th",
                        //    20    21    22    23    24    25    26    27    28    29
                        "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th",
                        //    30    31
                        "th", "st" };
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        SimpleDateFormat odf = new SimpleDateFormat("MMMM"); // Gives month name.
        Calendar dayEntered = new GregorianCalendar();
        dayEntered.setTime(sdf.parse("04/02/2013"));
        System.err.println("You chose date: " + odf.format(dayEntered.getTime()) + " " + dayEntered.get(Calendar.DAY_OF_MONTH) + suffixes[dayEntered.get(Calendar.DAY_OF_MONTH)]
        + " " + dayEntered.get(Calendar.YEAR));
        System.err.println("This is " + (((GregorianCalendar)dayEntered).isLeapYear(dayEntered.get(Calendar.YEAR)) ? "" : "not ") + "a leap year.");

        System.err.println("This is day: " + dayEntered.get(Calendar.DAY_OF_YEAR));
    }
于 2013-04-02T23:34:43.317 に答える
1

Here's one way of doing it. The issue is that there is no way to make a SimpleDateFormatter print ordinal values for the day. I have shamelessly stolen the getDayOfMonthSuffix method from here.

public static void main(String[] args) {
    final String input = "4/2/2013";
    final SimpleDateFormat parser = new SimpleDateFormat("MM/dd/yyyy");
    final SimpleDateFormat formatter1 = new SimpleDateFormat("MMMM");
    final GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
    final Date date;
    try {
        date = parser.parse(input);
        cal.setTime(date);
    } catch (ParseException ex) {
        System.out.println("Invalid input \"" + input + "\".");
        return;
    }
    if (cal.isLeapYear(cal.get(Calendar.YEAR))) {
        System.out.println("The year is a leap year");
    } else {
        System.out.println("The year is not a leap year");
    }
    System.out.println("The day of the year is " + cal.get(GregorianCalendar.DAY_OF_YEAR));
    final int dayOfMonth = cal.get(GregorianCalendar.DAY_OF_MONTH);
    System.out.println("The date is " +
            formatter1.format(date) +
            " " +
            dayOfMonth +
            getDayOfMonthSuffix(dayOfMonth) +
            ", " +
            cal.get(GregorianCalendar.YEAR));
}

static String getDayOfMonthSuffix(final int n) {
    if (n < 1 || n > 31) {
        throw new IllegalArgumentException("illegal day of month: " + n);
    }
    if (n >= 11 && n <= 13) {
        return "th";
    }
    switch (n % 10) {
        case 1:
            return "st";
        case 2:
            return "nd";
        case 3:
            return "rd";
        default:
            return "th";
    }
}
于 2013-04-02T23:38:26.073 に答える
0

あなたが言うように、より多くのフレームワークが必要なので-ここに行きます:

package com.yours

import java.io.Console;
import java.util.Calendar;

public class DoStuffWithADate {

    private Calendar parsedDate;

    public static void main(String[] args) {
        DoStuffWithADate soundsNaughty = new DoStuffWithADate();
        System.out.println("Enter a date my friend.  You should use the format: (MM/dd/yyyy)");
        Console theConsole = System.console();
        String enteredDate = theConsole.readLine();

        if (soundsNaughty.isValidDate(enteredDate)) {
            soundsNaughty.writeTheDateInNewFormat();
            soundsNaughty.writeIfItsALeapYear();
            soundsNaughty.writeTheDayOfYearItIs();
        }
    }

    private boolean isValidDate(String enteredDate) {
        //logic goes here.
        parsedDate = null;// if it's valid set the parsed Calendar object up.
        return true;
    }

    private void writeTheDateInNewFormat() {
        System.out.println("The new date format is: ");
    }

    private void writeIfItsALeapYear() {
        System.out.println("The year is a leap year.");
    }

    private void writeTheDayOfYearItIs() {
        System.out.println("The day of year is: ");
    }


}
于 2013-04-03T00:05:53.983 に答える