我的实体 class 中有一个 GregorianCalender,如何创建一个具有特定日期并在 toString() 中以特定格式显示的对象?

I have a GregorianCalender in my entity class, how do i create an object which has specific date and display in specific format in toString()?

public class Book {
    Calendar dateOfPublish;

    Book(Calendar dateOfPublish, ...){}

    public Calendar getDateOfPublish() {
        return dateOfPublish;
    }

    public void setDateOfPublish(int day, int month, int year) {
        this.dateOfPublish = dateOfPublish;
    }

    public String toString() {
                return Date Of Publish=" + dateOfPublish.YEAR + "/" + dateOfPublish.MONTH + "/" + 
                       dateOfPublish.DATE;
    }
}

我已尝试使用此 this 作为日历数据字段中的参数来实例化书籍对象。

new Book(new GregorianCalendar(2018,3,20));

但是当我用 toString() 显示对象时,它显示

Results:    
Date Of Publish=1/2/5

我在网上搜索过,看到有人用SimpleDateFormat,但是可以在实体class中完成吗?或者我应该使用更好的 Date/Calendar class 吗?

使用新的类:

LocalDate dateOfPublish = LocalDate.of(2018, 03, 2);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println(dtf.format(dateOfPublish));

详情参考DateTimeFormatter

这些是:

public String toString() {
        return "Date Of Publish = " + dateOfPublish.get(Calendar.YEAR) + " / " + dateOfPublish.get(Calendar.MONTH) + " / " +
                dateOfPublish.get(Calendar.DATE);
}

您已经使用完全相反的参数顺序声明了您的方法,您将在 Java 中可用的任何日期类型的构造函数中找到这些参数。

public void setDateOfPublish(int day, int month, int year) {
    //...
}

方法声明中的参数顺序应与调用它时传递的参数顺序相匹配,因此我建议您按如下方式声明方法以避免意外:

public void setDateOfPublish(int year, int month, int day) {
    //...
}

此外,java.util 日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API.

  • 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它向后移植了大部分 java.time Java 6 和 7 的功能。
  • 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring and

使用现代日期时间 API,您可以按如下方式进行:

import java.time.LocalDate;

class Book {
    LocalDate dateOfPublish;

    // ...

    public void setDateOfPublish(LocalDate dateOfPublish) {
        this.dateOfPublish = dateOfPublish;
    }

    public void setDateOfPublish(int year, int month, int day) {
        this.dateOfPublish = LocalDate.of(year, month, day);
    }

    public String toString() {
        return "Date Of Publish=" + dateOfPublish;
    }
}

public class Main {
    public static void main(String[] args) {
        Book book1 = new Book();
        book1.setDateOfPublish(LocalDate.of(2018, 3, 20));
        System.out.println(book1);

        Book book2 = new Book();
        book2.setDateOfPublish(2020, 2, 10);
        System.out.println(book2);
    }
}

输出:

Date Of Publish=2018-03-20
Date Of Publish=2020-02-10

Trail: Date Time.

了解有关现代日期时间 API 的更多信息