2017-02-06 7 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 lenient = true、lenient = true、zone = sun.util.calendar.ZoneInfo [id = "America/Los_Angeles"、オフセット= -28800000、dstSavings = 3600000、useDaylight = true、トランジション= 185、lastRule = java.util.SimpleTimeZone [id = America/Los_Angeles、offset = -28800000、dstSavings = 3600000、useDaylight = true、startYear = 0、startMode = 3、startMonth = 2、startDay = 8、startDayOfWeek = 1、 firstDayOfWeek = 1、minimalDaysInFirstWeek = 1、ERA = 1、YEAR = 1997、および、endTime = 1、endDayOfWeek = 1、endDayOfWeek = 1、endTime = 7200000、endTimeMode = 0] HOUSE = 2、HOUR_OF_DAY = 0、MINUTE = 0、SECOND = 0、MILLISECOND = 2、DAY_OF_YEAR = 0、ZONE_OFFSET = -28800000、DST_OFFSET = 0]

正社員

月LY給与:$ 8000.0


ID従業員の数:456

社員名:マイク・グエン

生年月日:java.util.GregorianCalendar [時間= ?, areFieldsSet = falseを、areAllFieldsSet =真、 lenient = true、zone = sun.util.calendar.ZoneInfo [id = "America/Los_Angeles"、オフセット= -28800000、dstSavings = 3600000、useDaylight = true、トランジション= 185、lastRule = java.util.SimpleTimeZone [id = America StartMode = 3、endMonth = 3、endMonth = 3、endMonth = 3、endMonth = 2、startDayOfWeek = 1、startTime = 7200000、startTimeMode = 0、startMode = 3、endMonth = 10、endDay = 1、endDay 1、ERA = 1、YEAR = 1977、MONTH = 5、WEEK_OF_YEAR = 6、WEEK_OF_MONTH = 2、DAY_OF_MONTH = 18、DAY_OF_YEAR = 37、DAY_OF_YEAR = 37、DAY_OF_ONE = DAY_OF_WEEK = 2、DAY_OF_WEEK_IN_MONTH = 1、AM_PM = 1、HOUR = 2、HOUR_OF_DAY = 0分= 0、SECOND = 0ミリ秒= 0、ZONE_OFFSET = -28800000、DST_OFFSET = 0]

正社員

月給:私の分析に基づいて$ 10400.0


、私はSimpleDateFormatのクラスからオブジェクトを作成し、パラメータに「MM/DD/YYYY」を置く使用する必要があると考えています。しかし、私はDateオブジェクトを作成してSimpleDateFormatオブジェクトを解析する必要があります。 Calendarオブジェクトを作成するためにCalendarクラスを使用したいと思います。

私がデバッグしていたとき、私は誕生日の表示が間違っていたことに気付きました。それは私の誕生日オブジェクト内のすべてを印刷しました。私は何をすべきか分からない。助けが大いに評価されるだろう。 :)

答えて

0

あなたがカレンダーオブジェクトを印刷しているので、可変誕生日です。

カレンダーに基づいて独自のクラスを実装したいと思うかもしれませんが、実際に期待することをするtoStringメソッドを使用してください。

2

まず、java.timeではなくCalendarを使用してください。

2番目のことは、日付を2回作成する必要がないことです(あなたは設定者でこれをやっています)。

そして最後にではなく、少なくとも、あなたは(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 timeを使用しないと、メソッドコンテキストで使用するたびにSimpleDateFormatインスタンスを作成したり、フォーマッタの静的インスタンスを同期させたりすることをお勧めします。 – Pavel

+0

または、フォーマッタをインスタンスメンバとして宣言するだけです。しかし、それをローカルオブジェクトにするという提案は良いです。 –

1

TL; DR

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

詳細

Answer by qwerty1423が正しい、と受け入れられるべきです。 toStringメソッドの結果が表示されます。 Calendarを使用することを強く希望する場合は、希望のフォーマットで文字列を生成する方法を学んでください。

java.time

しかし、あなたはCalendarを使用すべきではありません。これは、古くなった厄介な古い日時クラスの1つで、java.timeクラスに取って代わられています。レガシークラスはひどい混乱です。それらを避けてください。また、java.timeクラスはimmutable objectsを使用するため、thread-safeです。

LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。 YYYY-MM-DD:

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形式の文字列を生成します。他の形式については、java.time.format.DateTimeFormatterクラスのStack Overflowを検索してください。

  • FormatStyle文字列がどのくらいか、省略をする必要があります決定するために:、ローカライズ指定するには

  • Locale(a)日の名前、月の名前などの翻訳のための人間言語、および(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年3月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に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなどの面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

以降に準拠するを使用すると、java.timeオブジェクトをデータベースと直接交換できます。文字列やjava.sql。*クラスは必要ありません。

ここで、java.timeクラスを取得するには?

  • Java SE 8Java SE 9、以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6とJavaの多く
  • Android
    • java.timeクラスのAndroidのバンドル実装以降のバージョン。
    • 以前のAndroidの場合、ThreeTenABPプロジェクトはThreeTen-Backport(上記)に適合しています。 How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題