2017-02-06 9 views
0

Я ищу дату, используя объект календаря.отображение даты с использованием объекта календаря

public abstract class Employee implements EmployeeInfo { 

protected String firstName; 
protected String lastName; 
protected String idNumber; 
Calendar birthday = Calendar.getInstance(); 
protected char gender; 

public Employee() 
{ 
    firstName = ""; 
    lastName = ""; 
    idNumber = ""; 
    gender = ' '; 
    birthday.set(Calendar.MONTH, 0); 
    birthday.set(Calendar.DAY_OF_MONTH, 00); 
    birthday.set(Calendar.YEAR, 0000); 
} 

public Employee(String first, String last, String id, char gen, int month, int day, int year) 
{ 
    firstName = first; 
    lastName = last; 
    idNumber = id; 
    gender = gen; 
    birthday.set(Calendar.MONTH, month); 
    birthday.set(Calendar.DAY_OF_MONTH, day); 
    birthday.set(Calendar.YEAR, year); 
} 

public Calendar getBirthday() { 

    return birthday; 
} 

public void setBirthday(int month, int day, int year, Calendar birthday) throws ParseException { 
    birthday = Calendar.getInstance(); 
    birthday.set(Calendar.MONTH, month); 
    birthday.set(Calendar.DAY_OF_MONTH, day); 
    birthday.set(Calendar.YEAR, year); 
    SimpleDateFormat formatted = new SimpleDateFormat("MM/dd/yyyy"); 
    String date = month + "/" + day + "/" + year; 
    Date birth = formatted.parse(date); 
    birthday.setTime(birth); 
    this.birthday = birthday; 
} 

public String toSring() 
{ 
    return "ID Employee Number: " + idNumber + "\n" + "Employee name: " + firstName + " " 
      + lastName + "\n" + "Birth date: " + birthday + "\n"; 
} 

public abstract double getMonthlyEarning(); 

public class Staff extends Employee { 
protected double hourlyRate; 

public Staff() 
{ 
    super(); 
    hourlyRate = 0.0; 
} 

public Staff(String first, String last, String ID, char gen1, int month, int day, int year, double rate) 
{ 
    super(first, last, ID, gen1, month, day, year); 
    hourlyRate = rate; 
} 

} 

... и ...

public class Test { 

public static void main(String[] args) { 

    Employee[] employees = new Employee[2]; 
    employees[0] = new Staff("Minh", "Vu", "123", 'M', 3,06,1997, 50.00); 
    employees[1] = new Staff("Mike", "Nguyen", "456", 'M', 5,18,1977, 65.00); 

    for(Employee member : employees) 
    { 
     System.out.println(member); 
     System.out.println("------------------------------------------"); 
    } 
} 
} 

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

Номер ID сотрудников: 123

Имя сотрудника: Minh Vu

Дата рождения: java.util.GregorianCa lendar [время = ?, areFieldsSet = ложь, areAllFieldsSet = верно, мягок = верно, зона = sun.util.calendar.ZoneInfo [ID = "Америка/Los_Angeles", смещение = -28800000, dstSavings = 3600000, useDaylight = верно, переходы = 185, lastRule = java.util.SimpleTimeZone [ID = Америка/Los_Angeles, смещение = -28800000, dstSavings = 3600000, useDaylight = верно, StartYear = 0, StartMode = 3, StartMonth = 2, startDay = 8, startDayOfWeek = 1, начальный промежуток = 7200000, startTimeMode = 0, endMode = 3, endMonth = 10, endDay = 1, endDayOfWeek = 1, EndTime = 7200000, endTimeMode = 0]], firstDayOfWeek = 1, minimalDaysInFirstWeek = 1, ЭРА = 1, ГОД = 1997 МЕСЯЦ = 3, WEEK_OF_YEAR = 6, WEEK_OF_MONTH = 2, DAY_OF_MONTH = 6, day_of_year = 37, DAY_OF_WEEK = 2, DAY_OF_WEEK_IN_MONTH = 1, AM_PM = 1, ЧАС = 2, HOUR_OF_DAY = 0, МИНУТНЫЙ = 0, ВТОРОЙ = 0, миллисекунды = 0, ZONE_OFFSET = -28800000, DST_OFFSET = 0]

Full Time

месяц LY зарплата: $ 8000,0


ID Количество сотрудников: 456

Имя сотрудника: Майк Нгуен

Дата рождения: java.util.GregorianCalendar [время = ?, areFieldsSet = ложь, areAllFieldsSet = истина, мягок = верно, зона = sun.util.calendar.ZoneInfo [ID = "Америка/Los_Angeles", смещение = -28800000, dstSavings = 3600000, useDaylight = верно, переходы = 185, lastRule = java.util.SimpleTimeZone [ID = Америка/Los_Angeles, смещение = -28800000, dstSavings = 3600000, useDaylight = верно, StartYear = 0, StartMode = 3, StartMonth = 2, startDay = 8, startDayOfWeek = 1, = 7200000 начальный промежуток, startTimeMode = 0, endMode = 3, endMonth = 10, endDay = 1, endDay OfWeek = 1, EndTime = 7200000, endTimeMode = 0]], firstDayOfWeek = 1, minimalDaysInFirstWeek = 1, ЭРА = 1, ГОД = 1977, МЕСЯЦ = 5, WEEK_OF_YEAR = 6, WEEK_OF_MONTH = 2, DAY_OF_MONTH = 18, day_of_year = 37, DAY_OF_WEEK = 2, DAY_OF_WEEK_IN_MONTH = 1, AM_PM = 1, ЧАС = 2, HOUR_OF_DAY = 0, МИНУТНЫЙ = 0, ВТОРОЙ = 0, миллисекунды = 0, ZONE_OFFSET = -28800000, DST_OFFSET = 0]

Полный день

Ежемесячная зарплата: $ 10400,0


на основе моего анализа, я считаю, что я должен использовать создать объект из класса SimpleDateFormat и поставить «MM/DD/YYYY» в параметре. Тем не менее, я должен проанализировать объект SimpleDateFormat, создав объект Date. Я хотел бы использовать класс Calendar для создания объекта date.

Когда я был отлажен, я заметил, что отображение даты рождения было неправильным; он печатал все в моем объекте рождения. Я не уверен, что делать. Помощь будет принята с благодарностью. :)

ответ

0

Поскольку вы печатаете объект Calendar, это день рождения переменной.

Возможно, вы захотите реализовать свой собственный класс на основе Календаря, но с помощью метода toString, который на самом деле делает то, что вы ожидаете.

2

Прежде всего, вы должны использовать java.time не Calendar.

Во-вторых, вам не нужно дважды создавать дату (вы делаете это в своем сеттере).

И последнее, но не в последнюю очередь, вы должны отформатировать дату перед печатью (в toString() методом)

Это как ваш сеттер должен выглядеть следующим образом:

public void setBirthday(int month, int day, int year) { 
    this.birthday.set(Calendar.MONTH, month); 
    this.birthday.set(Calendar.DAY_OF_MONTH, day); 
    this.birthday.set(Calendar.YEAR, year); 
} 

или даже лучше:

public void setBirthday(Calendar birthday) { 
    this.birthday = birthday; 
} 

И это, как ваш метод toString() должен выглядеть следующим образом:

public String toString(){ 
    return "ID Employee Number: " + idNumber + "\n" + "Employee name: " + firstName + " " 
      + lastName + "\n" + "Birth date: " + formatter.format(birthday) + "\n"; 
} 

Так что вам нужно добавить это в ваш код:

private final static SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); 
+1

SimpleDateFormat не является потокобезопасным, поэтому лучше не объявлять это поле как статическое поле. Лучшим решением является использование форматирования JodaTime, потому что он потокобезопасен. Без времени joda лучший способ - создать экземпляр SimpleDateFormat каждый раз, когда вам нужно использовать его в контексте метода, или синхронизировать статический экземпляр форматирования. – Pavel

+0

Или просто объявите форматирование в качестве члена экземпляра. Но предложение сделать его локальным объектом лучше. –

1

ТЛ; дг

LocalDate birthdate; 
… 
this.birthdate = LocalDate.of(1955 , 3 , 17); // March 17, 1955. 

Подробности

Answer by qwerty1423 правильно, и должны быть приняты. Вы видите результаты метода toString. Если вы настаиваете на использовании Calendar, научитесь генерировать строку в нужном формате.

java.time

Но вы не должны использовать Calendar. Это один из неприятных старых классов времени, теперь устаревших, вытесненных классами java.time. Унаследованные классы - ужасный беспорядок; избежать их. Кроме того, классы java.time используют immutable objects и поэтому thread-safe.

Класс LocalDate представляет собой значение только для даты без времени суток и без часового пояса.

public abstract class Employee implements EmployeeInfo { 

    protected String firstName; 
    protected String lastName; 
    protected String idNumber; 
    LocalDate birthday; 

    // Constructor 
    public Employee() { 
     this.firstName = ""; 
     this.lastName = ""; 
     this.idNumber = ""; 
     this.birthday = LocalDate.MIN ; // Or some other arbitrary default value. 
    } 

    // Constructor 
    public Employee(String first, String last, String id, int month, int day, int year) 
    { 
     this.firstName = first; 
     this.lastName = last; 
     this.idNumber = id; 
     this.birthdate = LocalDate.of(year , month , day) ; 
    } 

Вызов LocalDate::toString для создания строки в стандартном формате ISO 8601: YYYY-MM-DD. Для других форматов поиск переполнения стека для класса java.time.format.DateTimeFormatter.

Для локализации, указать:

  • FormatStyle, чтобы определить, как долго или сокращенно должна быть строка.
  • Locale определить (а) человеческий язык для перевода имени дня, названия месяца и т. Д. И (b) культурные нормы, определяющие вопросы аббревиатуры, капитализации, пунктуации, разделителей и т. Д.

Пример:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(l); 
String output = this.birthdate.format(f); 

Смотрите эту code run live at IdeOne.com.

birthdate.toString(): 1955-03-17

выход: Jeudi 17 Марс 1955

Советы:

  • всегда использовать убывающем порядке значимости при заказе ваши дата-время: год, месяц, день, час, минута, секунда. Это логично, легко следовать и следует стилю стандарта ISO 8601 для значений даты и времени. Поэтому вместо передачи int month, int day, int year в качестве аргументов, пройдите int year , int month , int dayOfMonth.

  • Еще лучше, просто передайте объект LocalDate, а не просто целые числа. Это делает ваш код более self-documenting, обеспечивает действительные значения и обеспечивает type safety.


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Использование JDBC driver соответствует JDBC 4.2 или более поздней версии, вы можете обменять java.time объекты непосредственно с базой данных. Нет необходимости в строках или классах java.sql. *.

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть Явы.временная функциональность обратно перенесена на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android реализаций пачке классов java.time.
    • Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….

ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.