问题描述
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));
Results:
Date Of Publish=1/2/5
我在互联网上搜索过,看到有些人使用 SimpleDateFormat
,但它可以在实体类中完成吗?或者我应该使用什么更好的日期/日历类?
解决方法
您已使用与在 Java 中可用的任何日期类型的构造函数中找到的参数完全相反的顺序来声明您的方法。
public void setDateOfPublish(int day,int month,int year) {
//...
}
方法声明中参数的顺序应该与你传递给它的参数的顺序相匹配,因此我建议你按如下方式声明你的方法以避免意外:
public void setDateOfPublish(int year,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 和 How to use ThreeTenABP in Android Project。
使用现代日期时间 API,您可以按如下方式进行:
import java.time.LocalDate;
class Book {
LocalDate dateOfPublish;
// ...
public void setDateOfPublish(LocalDate dateOfPublish) {
this.dateOfPublish = dateOfPublish;
}
public void setDateOfPublish(int year,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 的更多信息。
,使用新类:
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);
}