-1

当我只想打印年、月和日时,我的 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=?]

**带有 dateOfBirth 字段的 Person 类* 包 hierarchybaseclasses;

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

4 回答 4

2

看看java.text.DateFormatand java.text.SimpleDateFormat(请记住:实例不是线程安全的,因此您应该拥有本地的、一次性使用的实例,而不是创建静态实例)。

更好的是,完成java.util日期/时间并切换到 java.time(你的出生日期将是LocalDate那时)

于 2018-02-12T15:52:14.913 回答
1

您要查找的不是日期本身,而是它的简短文本表示。为此,您必须使用格式化程序,例如:

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

于 2018-02-12T15:50:44.843 回答
0

tl;博士

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() ;

自动生成本地化字符串。指定 aLocale以确定用于本地化的人类语言和文化规范。

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

重新定义你的成员变量

你的类应该被重新定义为LocalDate成员变量的类型。如果您的目标是表示仅日期值,则不要使用 date-with-time 类型。而且,如上所述,该类出了名的麻烦和设计不佳,几年前在 Java 8 和 Java 9 中被JSR 310GregorianCalendar中定义的 java.time 类所取代。

于 2018-02-12T18:24:34.627 回答
-1

由于您显然没有使用 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);
于 2018-02-12T17:40:38.090 回答