我希望通过使用日历对象显示日期 .
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员 Worker 数:123
员工姓名:Minh Vu
出生日期:java.util.GregorianCalendar [time =?,areFieldsSet = false,areAllFieldsSet = true,lenient = true,zone = sun.util.calendar.ZoneInfo [id =“America / Los_Angeles”,offset = -28800000,dstSavings = 3600000,useDaylight =真,过渡= 185,lastRule = java.util.SimpleTimeZone中[ID =美洲/洛杉矶,偏移= -28800000,dstSavings = 3600000,useDaylight =真,startYear = 0,STARTMODE = 3,startMonth = 2,朝九特派= 8,startDayOfWeek = 1,开始时间= 7200000,startTimeMode = 0,endMode = 3,endMonth = 10,endday指定= 1,一个endDayOfWeek = 1,结束时间= 7200000,endTimeMode = 0]],Firstdayofweek可= 1,minimalDaysInFirstWeek = 1,ERA = 1,YEAR = 1997,MONTH = 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,HOUR = 2,HOUR_OF_DAY = 0,MINUTE = 0 ,SECOND = 0,微差= 0,ZONE_OFFSET = -28800000,DST_OFFSET = 0]
全职
月薪:8000.0美元
ID员 Worker 数:456
员工姓名:Mike Nguyen
出生日期:java.util.GregorianCalendar [time =?,areFieldsSet = false,areAllFieldsSet = true,lenient = true,zone = sun.util.calendar.ZoneInfo [id =“America / Los_Angeles”,offset = -28800000,dstSavings = 3600000,useDaylight =真,过渡= 185,lastRule = java.util.SimpleTimeZone中[ID =美洲/洛杉矶,偏移= -28800000,dstSavings = 3600000,useDaylight =真,startYear = 0,STARTMODE = 3,startMonth = 2,朝九特派= 8,startDayOfWeek = 1,开始时间= 7200000,startTimeMode = 0,endMode = 3,endMonth = 10,endday指定= 1,一个endDayOfWeek = 1,结束时间= 7200000,endTimeMode = 0]],Firstdayofweek可= 1,minimalDaysInFirstWeek = 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_WEEK = 2,DAY_OF_WEEK_IN_MONTH = 1,AM_PM = 1,HOUR = 2,HOUR_OF_DAY = 0,MINUTE = 0 ,SECOND = 0,微差= 0,ZONE_OFFSET = -28800000,DST_OFFSET = 0]
全职
月薪:10400.0美元
基于我的分析,我相信我必须使用SimpleDateFormat类中的create对象并将“MM / dd / yyyy”放入参数中 . 但是,我必须通过创建Date对象来解析SimpleDateFormat对象 . 我想使用Calendar类来创建我的日期对象 .
当我调试时,我注意到出生日期的显示是错误的;它在我的生日对象中打印了所有内容我不知道该怎么做 . 非常感谢帮助 . :)
3 回答
首先你应该使用
java.time
而不是Calendar
.第二件事是你不必两次创建你的日期(你在你的二传手中做到了) .
最后但并非最不重要的是,您必须在打印之前格式化日期(在
toString()
方法中)这就是你的setter应该是这样的:
甚至更好:
这就是你的
toString()
方法应该是这样的:所以你还需要将它添加到你的代码中:
tl;博士
详情
Answer by qwerty1423是正确的,应该被接受 . 您正在查看
toString
方法的结果 . 如果您坚持使用Calendar
,请学习以所需格式生成字符串 .java.time
但你不应该使用
Calendar
. 它是一个麻烦的旧日期时间类,现在已经遗留下来,取而代之的是java.time类 . 传统课程非常糟糕;避免他们 . 此外,java.time类使用immutable objects,因此thread-safe .LocalDate类表示没有时间且没有时区的仅日期值 .
调用LocalDate::toString以标准ISO 8601格式生成字符串:YYYY-MM-DD . 对于其他格式,请搜索java.time.format.DateTimeFormatter类的Stack Overflow .
要进行本地化,请指定:
FormatStyle以确定字符串应该多长或缩写 .
Locale确定(a)翻译日期名称,月份名称等的人类语言,以及(b)决定缩写,大写,标点符号,分隔符等问题的文化规范 .
例:
见code run live at IdeOne.com .
提示:
订购日期时间部件时,请始终使用递减次序:年,月,日,小时,分钟,秒 . 这是合乎逻辑的,易于遵循,并遵循日期时间值的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 .
现在位于maintenance mode的Joda-Time项目建议迁移到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.time功能都在ThreeTen-Backport中反向移植到Java 6&7 .
Android
更新版本的Android捆绑java.time类的实现 .
对于早期的Android,ThreeTenABP项目采用ThreeTen-Backport(如上所述) . 见How to use ThreeTenABP… .
ThreeTen-Extra项目使用其他类扩展了java.time . 该项目是未来可能添加到java.time的试验场 . 您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more .
因为您要打印日历对象变量生日是 .
您可能希望基于Calendar实现自己的类,但使用toString方法实际执行您期望的操作 .