【问题标题】:Getting birthday from calendar class java从日历类java获取生日
【发布时间】:2017-02-12 18:17:10
【问题描述】:
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;
        }
    }

}

抱歉,我需要帮助的所有内容都已正确格式化。我需要帮助将出生日期设置为我想要的任何日期,然后测试它是否是我的生日,或者该月份是否与我的出生月份相同。谢谢!

【问题讨论】:

  • 我强烈建议不要使用旧的 java.util.Calendarjava.util.Date 类。您应该改用 java.time 包中的类。
  • 注意,你可以重写你的布尔方法如下return Calendar.MONTH == this.dob.get(this.dob.MONTH;(如果else是多余的,在这样的方法中)。
  • 如果可以的话,我会使用 java.time,但我必须使用 java.util.Calendar 来完成这个特定的任务
  • 也许你应该把你的老师指向这些 cmets!

标签: java class oop


【解决方案1】:

你有两个问题:

  1. Calendar.MONTH 以 0 开头表示一月,而 Calendar.DAY_OF_MONTH 以 1 开头。所以你需要 this.dob.set(birthYear, birthMonth-1, birthDate);
  2. Calendar.DAY_OF_MONTHCalendar.MONTH 是字段索引,而不是今天的日期和月份。您需要创建日历的“今天”实例并针对 Calendar.getInstance().get(Calendar.DAY_OF_MONTH) 进行测试

正如@matoni 还建议的那样,您可以缩短检查方法。 @Andreas 为测试方法找到了一个更好的名称::

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

【讨论】:

  • 也许isSameAsToday 会是一个更好的名字。 isToday 令人困惑。
【解决方案2】:

tl;博士

今天是他/她的生日吗?

Boolean isBirthdayToday =
    MonthDay.from( LocalDate.of( 1953 , 1 , 23 ) )
            .equals( 
                MonthDay.from( LocalDate.now( ZoneId.of( "America/Montreal" ) ) ) 
            ) ;

这个月是他/她的生日吗?

Boolean isBirthdayThisMonth =
    Month.from( LocalDate.of( 1953 , 1 , 23 ) )
         .equals( 
             Month.from( LocalDate.now( ZoneId.of( "America/Montreal" ) ) ) 
         ) ;

使用 java.time

您正在使用麻烦的旧日期时间类,现在是遗留的,被 java.time 类取代。

LocalDate

LocalDate 类表示没有时间和时区的仅日期值。

您的Person 类的出生日期成员变量应该是LocalDate 类型。

LocalDate birthDate = LocalDate.of( 1953 , 1 , 23 );

我建议在您的代码周围传递LocalDate 对象,而不仅仅是年月日的整数。这样做可以使您的代码更具自记录性,提供类型安全性并确保有效值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

MonthDay

要查看今天是否是某人的生日,我们需要比较月份和日期,同时忽略年份。为此,请使用 MonthDay 类。

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

Month

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

Month birthMonth = Month.from( birthDate );
Month todayMonth= Month.from( today );
Boolean isBirthdayThisMonth = birthMonth.equals( todayMonth );

关于java.time

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

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多