【问题标题】:Not sure how to use getTime() with GregorianCalendar in Java [duplicate]不确定如何在 Java 中将 getTime() 与 GregorianCalendar 一起使用 [重复]
【发布时间】:2018-07-22 20:11:00
【问题描述】:

当我只想打印年、月和日时,我的 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 类* 包层级基类;

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

    }
 }

【问题讨论】:

  • 我试图格式化那个最高位,但这只是一场灾难。我不知道你要去那里。
  • 我不确定这是否接近最小示例。
  • GregorianCalendar 早已过时且设计不佳。好的答案是使用来自java.time, the modern Java date and time APILocalDate。现代 API 使用起来要好得多。而LocalDate 更简单、更自然、更清晰、更干净,完全符合您的要求。而且您不需要像DateGregorianCalendar 之间的转换。

标签: java date-formatting date-conversion gregorian-calendar java.util.calendar


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      重新定义你的成员变量

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

      【讨论】:

      • 亲爱的投票者,请在投票的同时留下评论。
      【解决方案4】:

      由于您显然没有使用 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);
      

      【讨论】:

        猜你喜欢
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多