使用日历对象显示日期

我正在寻找通过使用日历对象来显示日期。

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.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员工人数: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类创建一个对象,并将“MM / dd / yyyy”放入参数中。 但是,我必须通过创建Date对象来解析SimpleDateFormat对象。 我想用Calendar类创建我的日期对象。

当我调试时,我注意到出生日期的显示是错误的; 它会在我的生日对象中打印所有内容 我不知道该怎么做。 将不胜感激的帮助。 :)


首先你应该使用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");

TL;博士

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

细节

答案是qwerty1423是正确的,应该被接受。 您正在看到toString方法的结果。 如果您坚持使用Calendar ,请学习以您需要的格式生成一个字符串。

java.time

但你不应该使用Calendar 。 这是麻烦的旧日期时间类之一,现在是遗留的,被java.time类取代。 遗留的类是一个糟糕的混乱; 避免它们。 此外,java.time类使用不可变对象,因此是线程安全的。

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 );
    

    看到这个代码在IdeOne.com上运行。

    birthdate.toString():1955-03-17

    输出:1955年17月19日

    提示:

  • 订购日期时间部件时,请始终使用递减顺序:年,月,日,小时,分钟,秒。 这是合乎逻辑的,易于遵循,并遵循ISO 8601标准的日期 - 时间值的风格。 因此,而不是传递int month, int day, int year作为参数,传递int year , int month , int dayOfMonth

  • 更好的是,传递一个LocalDate对象而不是单纯的整数。 这样做会使您的代码更加自我记录,确保有效的值,并提供类型安全性。


  • 关于java.time

    java.time框架内置于Java 8及更高版本中。 这些类取代了诸如java.util.DateCalendarSimpleDateFormat等麻烦的旧式遗留日期时间类。

    现在处于维护模式的Joda-Time项目建议迁移到java.time类。

    要了解更多信息,请参阅Oracle教程。 并搜索堆栈溢出了很多例子和解释。 规范是JSR 310。

    使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。 不需要字符串和java.sql。*类。

    何处获取java.time类?

  • Java SE 8Java SE 9和更高版本
  • 内置。
  • 带有捆绑实现的标准Java API的一部分。
  • Java 9增加了一些次要功能和修复。
  • Java SE 6Java SE 7
  • 大部分java.time功能都在ThreeTen-Backport中移植到Java 6和7。
  • Android的
  • 后续版本的java.time类的Android捆绑实现。
  • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport(上文提到)。 请参阅如何使用ThreeTenABP ...。
  • ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 您可以在这里找到一些有用的课程,例如IntervalYearWeekYearQuarter等。


    因为你正在打印日历对象变量生日。

    你可能想要基于Calendar实现你自己的类,但是实际上可以实现你所期望的toString方法。

    链接地址: http://www.djcxy.com/p/399.html

    上一篇: displaying date using calendar object

    下一篇: Java convert data/time between timezone is inaccurate