从calendar类java获取生日

从calendar类java获取生日,java,class,oop,Java,Class,Oop,对不起,格式不正确,但我需要帮助的所有内容的格式都正确。我需要帮助将出生日期设置为我想要的任何日期,然后测试是否是我的生日,或者月份是否与我的出生月份相同。谢谢 您有两个问题: Calendar.MONTH一月以0开头,而Calendar.DAY/u月以1开头。所以你需要这个.dob.set(生日,生日-1,生日) Calendar.DAY/u/u MONTH和Calendar.MONTH是字段索引,而不是今天的日期和月份。您需要创建日历的“今天”实例,并根据该实例测试Calendar.getI

对不起,格式不正确,但我需要帮助的所有内容的格式都正确。我需要帮助将出生日期设置为我想要的任何日期,然后测试是否是我的生日,或者月份是否与我的出生月份相同。谢谢

您有两个问题:

  • Calendar.MONTH
    一月以0开头,而
    Calendar.DAY/u月以1开头。所以你需要
    这个.dob.set(生日,生日-1,生日)
  • Calendar.DAY/u/u MONTH
    Calendar.MONTH
    是字段索引,而不是今天的日期和月份。您需要创建日历的“今天”实例,并根据该实例测试
    Calendar.getInstance().get(Calendar.DAY\u of\u MONTH)
  • 正如@matoni所建议的,您可以缩短检查方法。 @Andreas为测试方法找到了一个更好的名称:

    import java.util.Calendar;
    
    public class Person {
    
        private Calendar dob = Calendar.getInstance();
        private String name;
        private int phoneNum;
    
    
        public Person (String name, int birthYear, int birthMonth, int birthDate) {
            this.name = name;
            this.dob.set(birthYear, birthMonth, birthDate);
        }
    
        public Calendar getDob() {
            return dob;
        }
        public void setDob(Calendar dob) {
            this.dob = dob;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getPhoneNum() {
            return phoneNum;
        }
        public void setPhoneNum(int phoneNum) {
            this.phoneNum = phoneNum;
        }
    
        // I want this to return true if today is my birthday
        public boolean isCurrentDayInMonthSameAsBirthDayInMonth() {
            if (Calendar.DAY_OF_MONTH == this.dob.get(this.dob.DAY_OF_MONTH)) {
                return true;
            }
            else { 
                return false;
            }
        }
    
        // I want this to return true if the month is the same as my birth month
        public boolean isCurrentMonthSameAsBirthMonth() {
            if (Calendar.MONTH == this.dob.get(this.dob.MONTH)) {
                return true;
            }
            else {
                return false;
            }
        }
    
    }
    
    tl;博士 今天是他/她的生日吗

    // I want this to return true if today is my birthday
    public boolean isCurrentDayInMonthSameAsBirthDayInMonth() {
        return isSameAsToday(Calendar.DAY_OF_MONTH);
    }
    
    // I want this to return true if the month is the same as my birth month
    public boolean isCurrentMonthSameAsBirthMonth() {
        return isSameAsToday(Calendar.MONTH);
    }
    
    private boolean isSameAsToday(int field){
        return Calendar.getInstance().get(field) == this.dob.get(field);
    }
    
    Boolean isBirthdayToday =
        MonthDay.from( LocalDate.of( 1953 , 1 , 23 ) )
                .equals( 
                    MonthDay.from( LocalDate.now( ZoneId.of( "America/Montreal" ) ) ) 
                ) ;
    
    这个月是他/她的生日吗

    // I want this to return true if today is my birthday
    public boolean isCurrentDayInMonthSameAsBirthDayInMonth() {
        return isSameAsToday(Calendar.DAY_OF_MONTH);
    }
    
    // I want this to return true if the month is the same as my birth month
    public boolean isCurrentMonthSameAsBirthMonth() {
        return isSameAsToday(Calendar.MONTH);
    }
    
    private boolean isSameAsToday(int field){
        return Calendar.getInstance().get(field) == this.dob.get(field);
    }
    
    Boolean isBirthdayToday =
        MonthDay.from( LocalDate.of( 1953 , 1 , 23 ) )
                .equals( 
                    MonthDay.from( LocalDate.now( ZoneId.of( "America/Montreal" ) ) ) 
                ) ;
    
    使用java.time 您使用的是麻烦的旧日期时间类,现在是遗留的,被java.time类取代

    LocalDate
    该类表示一个仅限日期的值,不包含一天中的时间和时区

    您的
    Person
    class'出生日期成员变量的类型应为
    LocalDate

    Boolean isBirthdayThisMonth =
        Month.from( LocalDate.of( 1953 , 1 , 23 ) )
             .equals( 
                 Month.from( LocalDate.now( ZoneId.of( "America/Montreal" ) ) ) 
             ) ;
    
    我建议在代码周围传递
    LocalDate
    对象,而不仅仅是年-月-日的整数。这样做会使您的代码更加自文档化,提供类型安全性,并确保有效值

    时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

    大陆/地区
    的格式指定,例如,或
    太平洋/奥克兰
    。切勿使用3-4个字母的缩写,如
    EST
    IST
    ,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

    MonthDay
    为了确定今天是否是此人的生日,我们需要比较月份和日期,而忽略年份。为此,请使用该类

    月份
    要比较出生月份而不是出生年月日,请使用枚举。与上面看到的代码相同

    MonthDay birthMonthDay = MonthDay.from( birthDate );
    MonthDay todayMonthDay= MonthDay.from( today );
    Boolean isBirthdayToday = birthMonthDay.equals( todayMonthDay );
    

    关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

    该项目现已启动,建议迁移到类

    要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

    从哪里获得java.time类

    • 后来
      • 内置的
      • 标准JavaAPI的一部分,带有捆绑实现
      • Java9添加了一些次要功能和修复
      • 大部分java.time功能都在中向后移植到Java6和Java7
      • 该项目专门为Android采用了ThreeTen Backport(如上所述)

    该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

    我强烈建议不要使用遗留的
    java.util.Calendar
    java.util.Date
    类。您应该改为使用
    java.time
    包中的类。注意,您可以按照以下方式重写布尔方法
    return Calendar.MONTH==this.dob.get(this.dob.MONTH;
    (如果其他方法是多余的,则使用这些方法)。如果可以的话,我会使用java.time,但是我必须使用java.util.Calendar来完成这个特殊的作业。也许你应该让你的老师看看这些注释!也许
    isSameAsToday
    会是一个更好的名称。
    isToday
    令人困惑。
    Month birthMonth = Month.from( birthDate );
    Month todayMonth= Month.from( today );
    Boolean isBirthdayThisMonth = birthMonth.equals( todayMonth );