Używanie GregorianCalendar z SimpleDateFormat

Tak więc przeszukiwałem mój mózg nad tym (powinno być) prostym ćwiczeniem, aby program zamienił ciąg znaków na obiekt GregorianCalendar, sformatował go i zwrócił go ponownie jako ciąg, gdy to się skończy.

Jest to ostatni mały fragment programu, który pobiera fragment tekstu z pliku, dzieli go na pojedyncze rekordy, a następnie dzieli rekordy na pojedyncze części danych i przypisuje je do obiektu osoby.

Sprawdziłem kod w wielu miejscach, a kod robi dokładnie to, co powinien robić, dopóki nie wywołam funkcji formatującej, która zgłasza wyjątek IllegalArgumentException. Obiektowi GergorianCalendar przypisywane są wartości, które mają być przypisane (chociaż drukowanie to znowu cała historia, jak widać poniżej ...), ale format nie zaakceptuje obiektu do formatowania.

Niestety, instruktor nie był zbyt pewny, jak korzystać z GregorianCalendar i SimpleDateFormat (jeszcze przydzielonych nam do pracy z nimi) i powiedział „Po prostu Google to”… Próbowałem i nic, co znalazłem, nie pomogło.

Dotychczasowy kod to:

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;
    }
}

Błąd, który otrzymuję to:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object >as a Date

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

I jeszcze jedno, czy nawet korzystam z GregorianCalendar? Kiedy drukuję wartość tego obiektu (powinienem dostać datę właściwie?) Dostaję to:

java.util.GregorianCalendar [time = ?, areFieldsSet = false, areAllFieldsSet = false, lenient = true, zone = sun.util.calendar.ZoneInfo [id = "America / Vancouver", offset = -28800000, dstSavings = 3600000, useDaylight = true, przejścia = 189, lastRule = java.util.SimpleTimeZone [id = America / Vancouver, 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 =?, ROK = 1985, MIESIĄC = 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, HOUR_OF_DAY = 0, MINUTE = 0, HOUR_OF_DAY = 0, MINUTE = 0, SECURD = 0, MILLISECOND = ?, ZONE_OFFSET = ?, DST_OFFSET =?]

Wartości roku, miesiąca i dnia_miesiąc są poprawne, ponieważ są to liczby, które przekazałem do utworzenia.

Myśli, sugestie, czy jestem nawet blisko?

edytować

oryginalne problemy zostały wyjaśnione (dziękuję assylias!), ale nadal nie mogę drukować poprawnie, ponieważ dwie funkcje nie są połączone, a wymagania mają mieć wydrukowaną wartość daty GregorianCalendar z obiektu osoby (jako data urodzenia jest GregorianCalendar).

Zaktualizowany kod:

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;
    }

}

ostatnia edycja

Ok, więc wydaje mi się, że jestem idiotą i NIE musiałem łączyć dwóch funkcji DateUtil razem, ale używać ich w tandemie. Najpierw przekonwertuj datę urodzin na kalendarz gregoriański i zapisz go w obiekcie osoby. Następnie w instrukcji drukowania po prostu powiedz programowi, aby sformatował tę datę podczas drukowania. Problem został rozwiązany. Wszystko działa teraz zgodnie ze specyfikacjami i czuję się o wiele bardziej głupio, ponieważ przez ostatni dzień wymachiwałem jak ryba z wody za pomocą klasy DateUtil, starając się, aby pracowali w tym samym czasie.

Dziękujemy za pomoc we właściwym przygotowaniu daty!

questionAnswers(5)

yourAnswerToTheQuestion