Не уверен, как использовать getTime() с GregorianCalendar в Java

Я получаю длинную распечатку моего GregorianCalendar, когда хочу печатать только год, месяц и день.

Вот что я получаю:

dateOfBirth=java.util.GregorianCalendar[time=173592000000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,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=1975,MONTH=6,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,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=?]}Faculty{dateOfHire=java.util.GregorianCalendar[time=173592000000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,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=1975,MONTH=6,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,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=?], dateOfTermination=java.util.GregorianCalendar[time=173592000000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,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=1975,MONTH=6,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,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=?]

** Класс Person с полем dateOfBirth * иерархия пакетов базовых классов;

import hierarchyinterfaces.IPerson;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Person implements IPerson {

    private String name;
    private String address;
    private String socialSecurityNumber;
    private GregorianCalendar dateOfBirth;

    public Person(){
        this.name = "";
        this.address = "";
        this.socialSecurityNumber = "";
        this.dateOfBirth = new GregorianCalendar();
    }
     public Person(String name, String address, String socialSecurityNumber, 
GregorianCalendar dateOfBirth) {
        this.name = name;
        this.address = address;
        this.socialSecurityNumber = socialSecurityNumber;
        this.dateOfBirth = new GregorianCalendar();
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
         return address;
    }

    public void setAddress(String address) {
         this.address = address;
    }

    public String getSocialSecurityNumber() {
        return socialSecurityNumber;
    }

    public void setSocialSecurityNumber(String socialSecurityNumber) {
        this.socialSecurityNumber = socialSecurityNumber;
    }

    @Override
    public GregorianCalendar getDateOfBirth() {
        Date date = new Date();
        dateOfBirth.setTime(date);
       // dateOfBirth.getTime();
        return dateOfBirth;
     }


     public void setDateOfBirth(GregorianCalendar dateOfBirth) {
        //Date date = new Date();
        //dateOfBirth.setTime(date);
        dateOfBirth.getTime();
        this.dateOfBirth = dateOfBirth;

    }



    @Override
    public String toString() {
        return "Person{" + "name=" + name + ", address=" + address + ", 
socialSecurityNumber=" + socialSecurityNumber + ", dateOfBirth=" + 
dateOfBirth + '}';
    }


}

Тестовый класс Это то, что инструктор предоставил.

иерархия пакетов базовых классов;

import java.util.GregorianCalendar;

public class TestClassAssignment3 {   

    public static void main(String[] args) {

        // Create a date which will be used in all test methods
        GregorianCalendar testDate = new GregorianCalendar(1975, 
GregorianCalendar.JULY, 3);

        // Create a classroom 
        Classroom classroom = new Classroom("PA100", "LECTUREHALL");
        System.out.println(classroom.toString());

        // Create a Faculty member
        // Uses the date created above
        Faculty faculty = new Faculty();
        faculty.setDateOfBirth(testDate);
        faculty.setName("Elizabeth Kramer");
        faculty.setAddress("1 University Ave");
        faculty.setSocialSecurityNumber("123456789");
        faculty.setStatus("PARTTIME");
        faculty.setDateOfHire(testDate);
        faculty.setDateOfTermination(testDate);
        faculty.setSalary(10000000);

        // Create an Offered Course 
        // Uses the classroom created above
        OfferedCourse newCourseOffering = new OfferedCourse("INFO301", "Java 
Programming", classroom);
        System.out.println(newCourseOffering.toString());

        // Create a FacultyCourse (link to course id of newCourseOffereing 
created above)
        FacultyCourse facultyCourse = new 
FacultyCourse(newCourseOffering.getCourseId());

        // Add to list of courses for the faculty
    faculty.getListOfCourses().add(facultyCourse);
        System.out.println(faculty.toString());

       // Create a Student 
        Student newStudent = new Student();
        newStudent.setDateOfBirth(testDate);
        newStudent.setName("Kathy Smith");
        newStudent.setAddress("1 Beech Ave");
        newStudent.setSocialSecurityNumber("567876567");
        newStudent.setDateOfGraduation(testDate);
        newStudent.setCurrentGPA(0.0f);

        // Create a Student Course (link to course id of newCourseOffereing 
created above)
        StudentCourse studentCourse = new 
StudentCourse(newCourseOffering.getCourseId());

        // Add course to student's list of courses
        newStudent.getEnrolledCourses().add(studentCourse);

        // Add grades to Student's Course 
        studentCourse.getCourseGrades().add(90.5f);
        studentCourse.getCourseGrades().add(100.0f);
        studentCourse.getCourseGrades().add(70.5f);
        studentCourse.getCourseGrades().add(65.0f);
        System.out.println(newStudent.toString());

    }
 }

4 ответа

Смотреть на java.text.DateFormat а также java.text.SimpleDateFormat (имейте в виду: экземпляры не являются потокобезопасными, и поэтому вы должны иметь локальные, одноразовые экземпляры вместо создания статических).

А еще лучше, покончим с java.util для даты / времени и переключиться на java.time (ваш DOB будет LocalDate затем)

То, что вы ищете, это не сама дата, а ее краткое текстовое представление. Для этого вы должны использовать форматтер, например:

dateOfBirth.toZonedDateTime().format(DateTimeFormatter.ISO_DATE)

ТЛ; др

myGregCal               // Avoid troublesome legacy class.
    .toZonedDateTime()  // Convert from legacy class to modern.
    .toLocalDate()      // Extract a date-only object without time-of-day and without time zone. 
    .toString()         // Generate a String in standard ISO 8601 format. 

1975-07-03

Избегайте старых классов

Хлопотно GregorianCalendar класс теперь унаследован, заменен классами java.time.

ZonedDateTime

Преобразуйте из устаревших классов в современные, вызывая новые методы, добавленные к старым классам.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

LocalDate

Если вы хотите только дату без времени суток и без часового пояса, извлеките LocalDate,

LocalDate ld = zdt.toLocalDate() ;

Генерировать строки

Генерация строки в стандартном формате ISO 8601 по умолчанию без необходимости шаблона форматирования.

String output = ld.toString() ;

Генерация строки локализуется автоматически. Укажите Locale определить человеческий язык и культурные нормы, используемые при локализации.

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f ) ;

Переопределите вашу переменную-член

Ваш класс должен быть переопределен, чтобы использовать LocalDate как тип переменной члена. Если ваша цель - представить значение только для даты, не используйте тип даты со временем. И, как упоминалось выше, GregorianCalendar Класс, как известно, проблематичен и плохо спроектирован, его заменили много лет назад в Java 8 и Java 9 на классы java.time, определенные в JSR 310.

Поскольку вы, очевидно, не имеете опыта работы с DateFormats или DateTimeFormatters, я собираюсь предложить гораздо более простой подход:

String date = 
    dateOfBirth.get(Calendar.YEAR) +
    "-" +
    (dateOfBirth.get(Calendar.MONTH) + 1) +
    "-" +
    dateOfBirth.get(Calendar.DAY_OF_MONTH);

Причиной добавления 1 к значению месяца является то, что get(Calendar.MONTH) не возвращает номер месяца. Он возвращает константу календарного месяца, такую ​​как Calendar.JANUARY, Calendar.FEBRUARY, …, а числовые значения этих констант равны 0, 1, 2, ….

Вы также можете использовать неявный Formatter:

String date = String.format("%tF", dateOfBirth);
Другие вопросы по тегам