如何在java中计算两个日期之间的年龄或差异
Posted
技术标签:
【中文标题】如何在java中计算两个日期之间的年龄或差异【英文标题】:how to calculate age or difference between two dates in java 【发布时间】:2013-12-23 16:23:17 【问题描述】:我想得到两个日期之间的月数。日期是某人的生日和当前日期。所以我得到两个日期之间的年数,而不是月数..
假设我的日期是 06/09/2011 和 06/11/2012。所以我希望答案是 1 年 2 个月。我得到了年份,但没有月份。请帮忙。下面是获取年数的代码
public int getAge(Date dateOfBirth)
today = Calendar.getInstance();
Calendar birthDate = Calendar.getInstance();
birthDate.setTime(dateOfBirth);
if (birthDate.after(today))
throw new IllegalArgumentException("Can't be born in the future");
age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR);
month = today.get(Calendar.MONTH) - birthDate.get(Calendar.MONTH);
if ( (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3) ||
(birthDate.get(Calendar.MONTH) > today.get(Calendar.MONTH )))
days = birthDate.get(Calendar.DAY_OF_MONTH) - today.get(Calendar.DAY_OF_MONTH);
age--;
Toast.makeText(getApplicationContext(), "inside if", Toast.LENGTH_SHORT).show();
Log.e("month is",month+"");
Log.e("Days",days+ " left");
else if ((birthDate.get(Calendar.MONTH) == today.get(Calendar.MONTH )) &&
(birthDate.get(Calendar.DAY_OF_MONTH) > today.get(Calendar.DAY_OF_MONTH )))
Toast.makeText(getApplicationContext(), "inside else if", Toast.LENGTH_SHORT).show();
age--;
return age;
【问题讨论】:
查看我的答案并尝试一下。 在发帖前尝试搜索。在 ***.com 上多次回答。专注于 Joda-Time,其中包括完全符合您目的的课程。从阅读问题开始,Joda-Time: what's the difference between Period, Interval and Duration?。 我没有使用 joda time,所以我正在寻找替代方案 【参考方案1】:Joda Time 有代码可以完成所有这些以及更多操作
您可以执行以下操作来获取两个日期之间的月份:
Calendar startCalendar = new GregorianCalendar();
startCalendar.setTime(startDate);
Calendar endCalendar = new GregorianCalendar();
endCalendar.setTime(endDate);
int diffYear = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
int diffMonth = diffYear * 12 + endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH);
查看Link
注意:如果您的日期是 2013-01-31
和 2013-02-01
,那么您将获得 1 个月的距离,这可能是您想要的,也可能不是。
【讨论】:
你说的是总时间以月为单位,但我想要以月和日为单位的年龄,比如你的年龄是 22 岁 5 个月 23 天【参考方案2】:我最近创建了一个演示并上传了here。
它使用JodaTime
库来获得有效的结果。
希望对你有用。
截图:
代码:
MainActivity.java
public class MainActivity extends Activity
private SimpleDateFormat mSimpleDateFormat;
private PeriodFormatter mPeriodFormat;
private Date startDate;
private Date endDate;
private Date birthDate;
private TextView tvStartDate,tvEndDate,tvDifferenceStandard,tvDifferenceCustom,tvBirthDate,tvAgeStandard,tvAgeCustom;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
//determine dateDiff
Period dateDiff = calcDiff(startDate,endDate);
tvDifferenceStandard.setText(PeriodFormat.wordBased().print(dateDiff));
tvDifferenceCustom.setText( mPeriodFormat.print(dateDiff));
//determine age
Period age = calcDiff(birthDate,new Date());
tvAgeStandard.setText(PeriodFormat.wordBased().print(age));
tvAgeCustom.setText( mPeriodFormat.print(age));
private void init()
//ui
tvStartDate = (TextView)findViewById(R.id.tvStartDate);
tvEndDate = (TextView)findViewById(R.id.tvEndDate);
tvDifferenceStandard = (TextView)findViewById(R.id.tvDifferenceStandard);
tvDifferenceCustom = (TextView)findViewById(R.id.tvDifferenceCustom);
tvBirthDate = (TextView)findViewById(R.id.tvBirthDate);
tvAgeStandard = (TextView)findViewById(R.id.tvAgeStandard);
tvAgeCustom = (TextView)findViewById(R.id.tvAgeCustom);
//components
mSimpleDateFormat = new SimpleDateFormat("dd/MM/yy");
mPeriodFormat = new PeriodFormatterBuilder().appendYears().appendSuffix(" year(s) ").appendMonths().appendSuffix(" month(s) ").appendDays().appendSuffix(" day(s) ").printZeroNever().toFormatter();
try
startDate = mSimpleDateFormat.parse(tvStartDate.getText().toString());
endDate = mSimpleDateFormat.parse(tvEndDate.getText().toString());
birthDate = mSimpleDateFormat.parse(tvBirthDate.getText().toString());
catch (ParseException e)
// TODO Auto-generated catch block
e.printStackTrace();
private Period calcDiff(Date startDate,Date endDate)
DateTime START_DT = (startDate==null)?null:new DateTime(startDate);
DateTime END_DT = (endDate==null)?null:new DateTime(endDate);
Period period = new Period(START_DT, END_DT);
return period;
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_
android:layout_
android:text="Date Diff Calculator"
android:textStyle="bold"
android:gravity="center"
android:background="@android:color/darker_gray"
/>
<TextView
android:layout_
android:layout_
android:textStyle="bold"
android:text="Start Date:" />
<TextView
android:id="@+id/tvStartDate"
android:layout_
android:layout_
android:text="06/09/2011" />
<TextView
android:layout_
android:layout_
android:textStyle="bold"
android:text="End Date:" />
<TextView
android:id="@+id/tvEndDate"
android:layout_
android:layout_
android:text="29/10/2013" />
<TextView
android:layout_
android:layout_
android:textStyle="bold"
android:text="Difference (Standard)" />
<TextView
android:id="@+id/tvDifferenceStandard"
android:layout_
android:layout_
android:text="result" />
<TextView
android:layout_
android:layout_
android:textStyle="bold"
android:text="Difference (Custom)" />
<TextView
android:id="@+id/tvDifferenceCustom"
android:layout_
android:layout_
android:text="result" />
<TextView
android:layout_
android:layout_
android:text="Age Calculator"
android:textStyle="bold"
android:gravity="center"
android:background="@android:color/darker_gray"
/>
<TextView
android:layout_
android:layout_
android:textStyle="bold"
android:text="Birth Date:" />
<TextView
android:id="@+id/tvBirthDate"
android:layout_
android:layout_
android:text="01/09/1989" />
<TextView
android:layout_
android:layout_
android:textStyle="bold"
android:text="Age (Standard)" />
<TextView
android:id="@+id/tvAgeStandard"
android:layout_
android:layout_
android:text="result" />
<TextView
android:layout_
android:layout_
android:textStyle="bold"
android:text="Age (Custom)" />
<TextView
android:id="@+id/tvAgeCustom"
android:layout_
android:layout_
android:text="result" />
注意:
1)
不要忘记add JodaTime library
到你的项目
2)
正如您在布局文件中看到的,我使用了"Start Date","End Date" to calculate Date Difference
的固定值和"Birth Date" to calculate Age
的固定值。你可以replace it with your dynamic values
。
【讨论】:
这里没有代码示例。我不必导航到另一个站点(可能被我的工作关闭或阻止的站点)来查看您的答案。 很好的解决方案,你只是忘记了 appendWeeks().appendSuffix(" week(s) ") @AviParshan 是的,我这样做是为了解释自定义格式化程序,标准格式的周参数已经存在:)【参考方案3】:java.time
因为这个答案是从here引用的…
使用java.time 课程,您可以非常轻松地计算年龄:
long years = ChronoUnit.YEARS.between(LocalDate.of(1900, Month.NOVEMBER, 20), LocalDate.now());
或(如果您需要年份和月份)
Period p = Period.between(birthday, today);
p.getYears();
p.getMonths();
要计算整个期间的所有月份,如问题中所述,请致电toTotalMonths
。
int totalMonths = p.toTotalMonths();
【讨论】:
【参考方案4】:年龄可以通过一种非常简单的方式计算出来。以下是我完整的java代码。
public class age
public static void main(String [] args)
Scanner s=new Scanner(System.in);
Date dd=new Date();
int d=Integer.parseInt(new SimpleDateFormat("dd").format(dd));
int m=Integer.parseInt(new SimpleDateFormat("MM").format(dd));
int y=Integer.parseInt(new SimpleDateFormat("yyyy").format(dd));
System.out.println( "Enter Day ");
int d1=Integer.parseInt(s.nextLine());
System.out.println( "Enter Month ");
int m1=Integer.parseInt(s.nextLine());
System.out.println( "Year");
int y1=Integer.parseInt(s.nextLine());
if(d<d1)
d+=30;
m-=1;
if(m<m1)
m+=12;
y-=1;
System.out.println((y-y1)+" years "+(m-m1)+" month "+(d-d1)+" days ");
【讨论】:
以上是关于如何在java中计算两个日期之间的年龄或差异的主要内容,如果未能解决你的问题,请参考以下文章