如何根据出生日期准确计算 Java 中的年龄
How can I calculate age in Java accurately given Date of birth
我正在尝试计算 java 中占月的年龄,因此仅减去年是行不通的。我还想告诉用户今天是不是他们的生日。这是我到目前为止的代码,但恐怕有点偏离。即使它比较的两个日期相等,它也不会判断今天是否是生日。我最初尝试计算的方式是使用毫秒。你看到 2 种获取当前日期的方法的原因是因为我正在尝试让它工作,但想向所有人展示我的工作,以便他们可以为我指明正确的方向。
编辑澄清
我的意思是 2015-1993 可以是 22 岁或 21 岁,具体取决于他们今年的生日是否已经过去。考虑到这一点,我想确定我得到了正确的年龄。
public class ShowAgeActivity extends AppCompatActivity {
private TextView usersAge;
private static long daysBetween(Date one, Date two)
{
long difference = (one.getTime()-two.getTime())/86400000; return Math.abs(difference);
}
private Date getCurrentForBirthday()
{
Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
int birthdayYear = birthday.getYear() + 1900;
Calendar cal = Calendar.getInstance();
cal.set(birthdayYear, Calendar.MONTH, Calendar.DAY_OF_MONTH);
Date current = cal.getTime();
return current;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_age);
Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
Date currentDay = Calendar.getInstance().getTime();
long age = daysBetween(birthday,currentDay)/365;
usersAge =(TextView)findViewById(R.id.ageTextView);
if (birthday.compareTo(getCurrentForBirthday()) == 0 )
{
usersAge.setText("It is your birthday, and your Age is " + String.valueOf(age));
}
usersAge.setText("Your Age is " + String.valueOf(age));
}
}
下面是一个例子,说明如何计算一个人的年龄,如果今天是他们的生日,以及如果今天不是他们的生日,还有多少天是他们的生日,使用新的 java.time 包 类 作为 Java 8.
的一部分
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1982, 9, 26);
LocalDate thisYearsBirthday = birthday.with(Year.now());
long age = ChronoUnit.YEARS.between(birthday, today);
if (thisYearsBirthday.equals(today))
{
System.out.println("It is your birthday, and your Age is " + age);
}
else
{
long daysUntilBirthday = ChronoUnit.DAYS.between(today, thisYearsBirthday);
System.out.println("Your age is " + age + ". " + daysUntilBirthday + " more days until your birthday!");
}
这是我用来计算某物年龄的代码。
Long time= currentDate.getTime / 1000 - birthdate.getTime / 1000
int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;
不错。但它忽略了时区问题。并且可能有更明确的方法。
时区
时区对于确定日期至关重要。例如,巴黎的新一天比蒙特利尔早。
如果省略,则隐式应用 JVM 当前的默认时区。我建议您改为明确 expect/desire.
的时区
使用 proper time zone name、continent/city 样式。切勿使用 3-4 个字母的代码,例如 "EST" 或 "IST".
java.time
java.time 框架(Tutorial) built into Java 8 and later includes the Period
class 将时间跨度表示为年数、月数和天数的组合。
您可以查询 Period
来提取这三个组件中的每一个。
Period 的 toString
方法默认生成由 ISO 8601 定义的格式的字符串,其中 P
标记开头,后跟数字和字母三次。比如一年半:P1Y6M
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
LocalDate birthdate = LocalDate.of( 1960 , 2 , 17 );
Period p = Period.between( birthdate , today );
String output = p.toString();
Integer age = p.getYears();
Boolean isTodayBirthday = ( (p.getMonths() == 0 ) && ( p.getDays() == 0 ) );
另一种方法使用 MonthDay
class 来表示没有年份的月日。
Boolean isBirthdayToday =
MonthDay.from( birthdate )
.equals( MonthDay.from( today ) ) ;
Android
对于Android,你没有Java8技术如java.time。
您可以搜索一些向后移植 java.time classes 的项目。我不知道他们有多成功。
此外,您还可以使用 Joda-Time,这是一个启发 java.time 框架 (JSR 310) 的第三方库。 Joda-Time 代码应该与上面类似。除了 Period class 具有更精细的分辨率,可以达到小时、分钟和秒。要截断多余的数据,请调用 withTimeAtStartOfDay
方法。
这对我有用。
Calendar currentDate = Calendar.getInstance();
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
Date birthdate = null;
try {
birthdate = myFormat.parse(yourDate);
} catch (ParseException e) {
e.printStackTrace();
}
Long time= currentDate.getTime().getTime() / 1000 - birthdate.getTime() / 1000;
int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;
我正在尝试计算 java 中占月的年龄,因此仅减去年是行不通的。我还想告诉用户今天是不是他们的生日。这是我到目前为止的代码,但恐怕有点偏离。即使它比较的两个日期相等,它也不会判断今天是否是生日。我最初尝试计算的方式是使用毫秒。你看到 2 种获取当前日期的方法的原因是因为我正在尝试让它工作,但想向所有人展示我的工作,以便他们可以为我指明正确的方向。
编辑澄清 我的意思是 2015-1993 可以是 22 岁或 21 岁,具体取决于他们今年的生日是否已经过去。考虑到这一点,我想确定我得到了正确的年龄。
public class ShowAgeActivity extends AppCompatActivity {
private TextView usersAge;
private static long daysBetween(Date one, Date two)
{
long difference = (one.getTime()-two.getTime())/86400000; return Math.abs(difference);
}
private Date getCurrentForBirthday()
{
Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
int birthdayYear = birthday.getYear() + 1900;
Calendar cal = Calendar.getInstance();
cal.set(birthdayYear, Calendar.MONTH, Calendar.DAY_OF_MONTH);
Date current = cal.getTime();
return current;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_age);
Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
Date currentDay = Calendar.getInstance().getTime();
long age = daysBetween(birthday,currentDay)/365;
usersAge =(TextView)findViewById(R.id.ageTextView);
if (birthday.compareTo(getCurrentForBirthday()) == 0 )
{
usersAge.setText("It is your birthday, and your Age is " + String.valueOf(age));
}
usersAge.setText("Your Age is " + String.valueOf(age));
}
}
下面是一个例子,说明如何计算一个人的年龄,如果今天是他们的生日,以及如果今天不是他们的生日,还有多少天是他们的生日,使用新的 java.time 包 类 作为 Java 8.
的一部分 LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1982, 9, 26);
LocalDate thisYearsBirthday = birthday.with(Year.now());
long age = ChronoUnit.YEARS.between(birthday, today);
if (thisYearsBirthday.equals(today))
{
System.out.println("It is your birthday, and your Age is " + age);
}
else
{
long daysUntilBirthday = ChronoUnit.DAYS.between(today, thisYearsBirthday);
System.out.println("Your age is " + age + ". " + daysUntilBirthday + " more days until your birthday!");
}
这是我用来计算某物年龄的代码。
Long time= currentDate.getTime / 1000 - birthdate.getTime / 1000
int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;
时区
时区对于确定日期至关重要。例如,巴黎的新一天比蒙特利尔早。
如果省略,则隐式应用 JVM 当前的默认时区。我建议您改为明确 expect/desire.
的时区使用 proper time zone name、continent/city 样式。切勿使用 3-4 个字母的代码,例如 "EST" 或 "IST".
java.time
java.time 框架(Tutorial) built into Java 8 and later includes the Period
class 将时间跨度表示为年数、月数和天数的组合。
您可以查询 Period
来提取这三个组件中的每一个。
Period 的 toString
方法默认生成由 ISO 8601 定义的格式的字符串,其中 P
标记开头,后跟数字和字母三次。比如一年半:P1Y6M
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
LocalDate birthdate = LocalDate.of( 1960 , 2 , 17 );
Period p = Period.between( birthdate , today );
String output = p.toString();
Integer age = p.getYears();
Boolean isTodayBirthday = ( (p.getMonths() == 0 ) && ( p.getDays() == 0 ) );
另一种方法使用 MonthDay
class 来表示没有年份的月日。
Boolean isBirthdayToday =
MonthDay.from( birthdate )
.equals( MonthDay.from( today ) ) ;
Android
对于Android,你没有Java8技术如java.time。
您可以搜索一些向后移植 java.time classes 的项目。我不知道他们有多成功。
此外,您还可以使用 Joda-Time,这是一个启发 java.time 框架 (JSR 310) 的第三方库。 Joda-Time 代码应该与上面类似。除了 Period class 具有更精细的分辨率,可以达到小时、分钟和秒。要截断多余的数据,请调用 withTimeAtStartOfDay
方法。
这对我有用。
Calendar currentDate = Calendar.getInstance();
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
Date birthdate = null;
try {
birthdate = myFormat.parse(yourDate);
} catch (ParseException e) {
e.printStackTrace();
}
Long time= currentDate.getTime().getTime() / 1000 - birthdate.getTime() / 1000;
int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;