34

GregorianCalendarそこで私は、プログラムが日付文字列をオブジェクトに変換し、書式を設定し、完了したら文字列として返すようにするこの (あるべき) 簡単な演習について頭を悩ませてきました。

これは、ファイルからテキストのチャンクを取り込み、それを個々のレコードに分割し、次にレコードを個々のデータに分割して人物オブジェクトに割り当てるプログラムの最後の部分です。

複数の場所でコードをチェックしましたが、コードは、フォーマット関数を呼び出すまで、本来の動作を正確に実行しますIllegalArgumentException。オブジェクトには、GergorianCalendar割り当てられるはずの値が割り当てられます (ただし、以下に示すように、印刷はまったく別の話です...) が、フォーマットはオブジェクトの書式設定を受け入れません。

GregorianCalendar残念ながら、講師はandの使い方がよくわからずSimpleDateFormat(まだ私たちに彼らと一緒に作業するように割り当てられていました)、「Google で検索してみてください…」と言いました。

私がこれまでに持っているコードは次のとおりです。

public class DateUtil {

    public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException{

        // this actually works, got rid of the original code idea
        String[] splitDate = dd_mm_yy.split("-");
        int days = Integer.parseInt(splitDate[0]);
        int month = Integer.parseInt(splitDate[1]);
        int year = Integer.parseInt(splitDate[2]);

        // Dates are going in right, checked in print statement,
        // but the object is not getting formatted…
        GregorianCalendar dateConverted = new GregorianCalendar(year, month, days);
        format(dateConverted);
        return dateConverted;
    }

    public static String format(GregorianCalendar date){

        SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
        String dateFormatted = fmt.format(date);
        return dateFormatted;
    }
}

私が得るエラーは次のとおりです。

スレッド「メイン」での例外 java.lang.IllegalArgumentException: 指定されたオブジェクトを日付としてフォーマットできません

    java.text.DateFormat.format(DateFormat.java:281) で
    java.text.Format.format(Format.java:140) で
    lab2.DateUtil.format(DateUtil.java:26) で
    lab2.DateUtil.convertFromDMY(DateUtil.java:19) で
    lab2.Lab2.createStudent(Lab2.java:75) で
    lab2.Lab2.main(Lab2.java:34)

もう1つ、私はGregorianCalendar権利を使用していますか?? そのオブジェクトの値を出力すると (日付を取得する必要がありますよね?)、次のようになります。

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="アメリカ/バンクーバー",offset=-28800000,dstSavings=3600000,useDaylight =true,transitions=189,lastRule=java.util.SimpleTimeZone[id=アメリカ/バンクーバー,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8, startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?, YEAR=1985,MONTH=4,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=22,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND= 0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

year、month、day_of_month の値は、作成時に渡した数値であるため、すべて正しいです。

考え、提案、私は親しいですか?

編集

元の問題は解消されました (assylias に感謝します!) が、2 つの関数がリンクされておらず、要件がGregorianCalendarperson オブジェクトから日付値を出力する必要があるため (生年月日が a であるため)、まだ正しく印刷できませんGregorianCalendar

更新されたコード:

public class DateUtil {

    static SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");

    public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException{

        // this actually works, got rid of the original code idea
        String[] splitDate = dd_mm_yy.split("-");
        int days = Integer.parseInt(splitDate[0]);
        int month = (Integer.parseInt(splitDate[1]) - 1);
        int year = Integer.parseInt(splitDate[2]);

        // dates go in properly
        GregorianCalendar dateConverted = new GregorianCalendar(year, month, days);
        String finalDate = format(dateConverted);
        return ;
    }

    public static String format(GregorianCalendar date) throws ParseException{

       fmt.setCalendar(date);
        String dateFormatted = fmt.format(date.getTime());
        System.out.println(dateFormatted);
        return dateFormatted;
    }

}

最終編集

わかりました、それで私はばかで、2 つのDateUtil関数を一緒にリンクする必要はありませんでしたが、それらをタンデムで使用しているようです。まず、生年月日を に変換し、GregorianCalendarそれを person オブジェクトに格納します。次に、print ステートメントで、印刷時にその日付をフォーマットするようにプログラムに指示するだけです。問題は解決しました。DateUtilすべてが仕様どおりに機能するようになりました。クラスの最終日かそこらで、それらを同時に機能させようとして、水から出た魚のようにバタバタしていたので、私はずっとばかげていると感じています。

日付を適切に入力するためのすべての助けに感謝します!

4

5 に答える 5

57

SimpleDateFormat.format()メソッドはDateパラメーターとして を受け取ります。メソッドを呼び出すことで、Dateからを取得できます。CalendargetTime()

public static String format(GregorianCalendar calendar) {
    SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
    fmt.setCalendar(calendar);
    String dateFormatted = fmt.format(calendar.getTime());

    return dateFormatted;
}

また、月は 0 から始まることに注意してください。

int month = Integer.parseInt(splitDate[1]) - 1;
于 2012-05-31T08:33:10.537 に答える
5

なぜそのような合併症が発生するのですか?

public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException 
{
    SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
    Date date = fmt.parse(dd_mm_yy);
    GregorianCalendar cal = GregorianCalendar.getInstance();
    cal.setTime(date);
    return cal;
}
于 2012-05-31T08:34:18.283 に答える
3

ASimpleDateFormatは、その名前が示すように、Datesをフォーマットします。ではありませんCalendar。したがって、GregorianCalendarを使用してフォーマットする場合は、を最初にSimpleDateFormat変換する必要があります。CalendarDate

dateFormat.format(calendar.getTime());

そして、あなたが印刷しているtoString()のはカレンダーの表現です。使用目的はデバッグです。GUIで日付を表示するために使用することを意図したものではありません。そのためには、(Simple)を使用しDateFormatます。

最後に、をに変換するStringには、実行中にを分割するのではなく、( )(そのメソッド)Dateも使用する必要があります。これによりオブジェクトが作成され、インスタンス化()して時間()を設定することでからを作成できます。SimpleDateFormatparse()StringDateCalendarDateCalendar.getInstance()calendar.setTime()

私のアドバイスは次のとおりです。グーグルはここでの解決策ではありません。APIドキュメントを読むことはあなたがする必要があることです。

于 2012-05-31T08:38:57.463 に答える
2
  1. あなたはそこに2桁の年を入れています。最初の世紀。そしてグレゴリオ暦は16世紀に始まりました。年に 2000 を追加する必要があると思います。

  2. 関数の月new GregorianCalendar(year, month, days)は 0 ベースです。そこの月から1を引きます。

  3. 2 番目の関数の本体を次のように変更します。

        String dateFormatted = null;
        SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
        try {
            dateFormatted = fmt.format(date);
        }
        catch ( IllegalArgumentException e){
            System.out.println(e.getMessage());
        }
        return dateFormatted;
    

GregorianCalendarデバッグ後、単にの引数にできないことがわかりますfmt.format();

本当に、GregorianCalendar「文字列」を返すように言われたとしても、誰も出力として必要としません。

format 関数のヘッダーを次のように変更します。

public static String format(final Date date) 

適切な変更を加えます。喜んでオブジェクトfmt.format()を受け取ります。Date

  1. 予期しない例外が発生した後は常に、自分でキャッチし、Java マシンにそれを許可しないでください。このように、問題を理解することができます。
于 2012-05-31T09:21:04.837 に答える