Bo twórcy biblioteki GregorianCalendar tak ją zaprojektowali, że metoda toString() jest zalecana tylko do celów debugowania. A datę pobieramy getterami. Czytając z dokumentacji " This method is intended to be used only for debugging purposes, and the format of the returned string may vary between implementations. The returned string may be empty but may not be null."
podczas wywołania System.out.println(time);
domyślnie na obiekcie time klasy GregorianCalendar wywoływana jest metoda toString(), która wypisuje wszystkie pola tej klasy (albo większość nie zgłebiałem się).
Ewentualnie można przeładować (Overriding) toString np. tak:
GregorianCalendar time = new GregorianCalendar(1999, 2, 2){
public String toString() {
return String.format("%d/%02d/%02d", get(YEAR), get(MONTH), get(DAY_OF_MONTH));
}
};
Natomiast na obiekcie klasy Date metoda toString() działa tak jak w GregorianCalender getTime(), czyli ładnie zwraca to co zazwyczaj mamy na myśli wywołując toString na obiekcie danej klasy.