Не уверен, как использовать 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);