当前位置: 首页 > 知识库问答 >
问题:

使用日历对象显示日期

孔梓
2023-03-14

我希望使用calendar对象显示日期。

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

员工姓名:明武

出生日期:java.util.GregorianCalendar[time=?, areFieldsSet=false, areAllFieldsSet=true, lenient=true, zone=sun.util.calendar.ZoneInfo[id="America/Los_Angeles",偏移量=-28800000, dstSavings=3600000, useDaylight=true,过渡=185, lastRur=java.util.SimpleTimeZone[id=America/Los_Angeles,偏移量=-28800000, dstSavings=3600000, useDaylight=true, start York=0, start Mode=3, start Month=2, start Day=8, DayOfWeekWeek=1, start Time=7200000, start TimeMode=0, endMode=3, endMonth=10, endDay=1, endDayOfWeek=1, endTime=7200000, endTimeMode=0]], firstDayOfWeek=1,最小DaysInFirstWeek=1, ERA=1, YEAR=1997, MONTH=3,WEEK_OF_YEAR=6,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=

全职

月薪:8000美元

ID员工编号:456

员工姓名:Mike Nguyen

出生日期:爪哇。util。GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=“America/Los_Angeles”,offset=-2880000,dstSavings=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone【id=美国/洛杉矶,偏移量为2880万,DST储蓄为3600万,UsDaDaDayl=真,StartyEA0=0,startMode=3,startMonth=2,startDay=8,StartDayOWeek=1,StartDayOWeek=1,startDay=2,startDay=2,startDay=8,startDay=8,StartDayOOOwwWeek=1,StartDayWeek=1,StartDayWeek=1,StartDayWeek=1,StartDayWeek=1,Start=1,StartDayWeek=1,Start=1,StartDayWeek=1,StartDayE8=1,StartDayWeek=1,Start=1,Start=1,StartDayWeek=1,Start=1,Start=1,StartDayWeek=1,周中的天,月中的上午下午1点,小时2点,日中的小时0点,分钟0点,秒0点,毫秒0点,区域偏移量=-2880000点,DST偏移量=0点]

全职

月薪:10400.0美元

根据我的分析,我认为我必须使用SimpleDataFormat类创建一个对象,并将“MM/dd/yyyy”放入参数中。但是,我必须通过创建日期对象来解析SimpleDataFormat对象。我想使用Calendar类创建日期对象。

当我在调试时,我注意到出生日期的显示是错误的;它打印了我生日对象中的所有内容。我不知道该怎么办。非常感谢您的帮助。:)

共有3个答案

姬经义
2023-03-14

因为您正在打印日历对象,所以变量生日是。

您可能希望基于Calendar实现自己的类,但使用一个toString方法,该方法实际上实现了您所期望的功能

宫坚
2023-03-14
LocalDate birthdate;
…
this.birthdate = LocalDate.of( 1955 , 3 , 17 ); // March 17, 1955. 

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

但你不应该使用日历。它是一个麻烦的旧日期时间类,现在是遗留的,被java取代。时间课。遗留类是一团乱麻;避开它们。还有java。时间类使用不可变对象,因此是线程安全的。

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的堆栈溢出。时间总体安排DateTimeFormatter类。

要本地化,请指定:

  • FormatStyle来确定字符串应该有多长或缩写。
  • 区域设置确定(a)翻译日名、月名等的人类语言,以及(b)决定缩写、大写、标点符号、分隔符等问题的文化规范。

例子:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = this.birthdate.format( f );

查看此代码在IdeOne上的实时运行。通用域名格式。

生日。toString():1955-03-17

输出:jeudi 17 mars 1955

提示:

>

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

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

    java.time框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,例如java.util.DateCalendar

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

    要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310。

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

    从哪里获得java.time课程?

    • JavaSE8、JavaSE9及更高版本
    • 许多java.time功能被反向移植到Java6
    • 更高版本的Android捆绑包实现了java。时间课

    额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,等等。

  • 洪俊捷
    2023-03-14

    首先,你应该使用java。时间不是日历。

    第二件事是你不必创建你的日期两次(你是在你的setter中做的)。

    最后但同样重要的是,您必须在打印日期之前格式化日期(在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");
    
     类似资料:
    • 问题内容: 我有一个电影课,里面有开始日期,持续时间和结束日期。开始和停止日期是日期对象(私有日期startDate …)(这是一个分配,因此我无法更改),现在我想通过将持续时间(以分钟为单位)添加到startDate中来自动计算stopDate。 据我所知,不赞成使用Date的时间操作功能,因此是不好的做法,但另一方面,我看不到将Date对象转换为日历对象以操纵时间并将其重新转换为Date对象的

    • 我创建了新的SimpleDataFormat对象,它将给定字符串解析为日期对象。日期格式如下: 我将此日期设置为日历实例,如下所示: 现在我从这个日历中获取一周中的哪一天。它给出了错误的值。 它给出的输出是7,即周六,但预期值是5,即周四。有什么问题吗?

    • 在JS中,如果我将一个字符串记录到控制台,它是否没有正确显示? 后果 那么为什么显示的是[object],而不是值呢?它就像是在附加字符串的情况下更改类型?

    • 如何更改日历视图特定日期的颜色?我正在创建一个简单的应用程序,可以在日历上添加事件,我想突出显示有事件的日期。有人能告诉我怎么做吗?如果不可能,请给我一些其他的建议。

    • 我使用了以下库作为日历,但它显示的星期的第一天是星期一,我想以星期日开始一天。 https://github.com/applandeo/material-calendar-view 我修改了相应的代码,但它仍然显示日期,因此星期一是第一天。

    • 问题内容: 这是关于如何在django支持的网站中使用jQuery 。 是 我正在使用。 我正在使用和创建成功显示日期。 但未显示日期选择器图标。我正在使用Django模型形式。 问题答案: 你可以使用来将a传递给表单,该表单将在html中呈现。然后,将读取该内容以呈现功能。 这是一个例子: …或使用ModelForm时通过Meta类中的属性: 现在在模板中: