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;
}
}
}
很抱歉格式,但我需要帮助的所有内容都已正确格式化。我需要帮助将dob设置为我想要的任何日期,然后测试是否是我的生日或月份是否与我的出生月份相同。谢谢!
答案 0 :(得分:2)
你有两个问题:
Calendar.MONTH
从1开始为0,而Calendar.DAY_OF_MONTH
从1开始。所以你需要this.dob.set(birthYear, birthMonth-1, birthDate);
Calendar.DAY_OF_MONTH
和Calendar.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);
}
答案 1 :(得分:1)
今天是他/她的生日吗?
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类。
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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。