我怎样才能找到两个日期之间的年数?

Mic*_*ine 53 java android date

我试图确定从某个日期开始的年龄.有没有人知道在Android中这样做的干净方法?我显然有Java api可用,但直接的java api非常弱,我希望Android有一些东西可以帮助我.

编辑:在Android中使用Joda时间的多个建议让我有点担心Android Java - Joda Date很慢且相关问题.此外,拉入一个未随平台一起提供的库,这个尺寸可能太大了.

sin*_*pop 100

import java.util.Calendar;
import java.util.Locale;
import static java.util.Calendar.*;
import java.util.Date;

public static int getDiffYears(Date first, Date last) {
    Calendar a = getCalendar(first);
    Calendar b = getCalendar(last);
    int diff = b.get(YEAR) - a.get(YEAR);
    if (a.get(MONTH) > b.get(MONTH) || 
        (a.get(MONTH) == b.get(MONTH) && a.get(DATE) > b.get(DATE))) {
        diff--;
    }
    return diff;
}

public static Calendar getCalendar(Date date) {
    Calendar cal = Calendar.getInstance(Locale.US);
    cal.setTime(date);
    return cal;
}
Run Code Online (Sandbox Code Playgroud)

  • 常数MONTH,YEAR和DATE是什么? (4认同)
  • @ChrisSim:它们是Calendar.MONTH的静态导入,依此类推. (4认同)
  • 我认为而不是DATE应该是DAY_OF_MONTH. (2认同)
  • @jiahao:他们是同义词 (2认同)

Mar*_*elo 16

我建议使用伟大的Joda-Time库来处理与Java相关的所有日期.

根据您的需要,您可以使用该Years.yearsBetween()方法.

  • 只是详细说明:`public int getYears(org.java.util.Date time) { org.joda.time.DateTime now = org.joda.time.DateTime.now(); org.joda.time.DateTime then = new org.joda.time.DateTime(time.getTime()); 返回 org.joda.time.Years.yearsBetween(now, then).getYears(); }` (2认同)

Bas*_*que 15

TL;博士

ChronoUnit.YEARS.between( 
    LocalDate.of( 2010 , 1 , 1 ) , 
    LocalDate.now( ZoneId.of( "America/Montreal" ) ) 
)
Run Code Online (Sandbox Code Playgroud)

java.time

旧的日期时间类真的很糟糕,太糟糕了,Sun和Oracle同意用java.time类取代它们.如果您使用日期时间值进行任何重要工作,那么在项目中添加库是值得的.Joda-Time库非常成功并推荐,但现在处于维护模式.该团队建议迁移到java.time类.

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植,并进一步适应的AndroidThreeTenABP(见如何使用......).

LocalDate start = LocalDate.of( 2010 , 1 , 1 ) ;
LocalDate stop = LocalDate.now( ZoneId.of( "America/Montreal" ) );
long years = java.time.temporal.ChronoUnit.YEARS.between( start , stop );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println( "start: " + start + " | stop: " + stop + " | years: " + years ) ;
Run Code Online (Sandbox Code Playgroud)

开始时间:2010-01-01 | 停止:2016-09-06 | 年:6


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


小智 5

我显然还不能发表评论,但我认为你可以使用 DAY_OF_YEAR 来锻炼是否应该将年份向下调整一年(从当前最佳答案复制和修改)

public static int getDiffYears(Date first, Date last) {
    Calendar a = getCalendar(first);
    Calendar b = getCalendar(last);
    int diff = b.get(Calendar.YEAR) - a.get(Calendar.YEAR);
    if (a.get(Calendar.DAY_OF_YEAR) > b.get(Calendar.DAY_OF_YEAR)) {
        diff--;
    }
    return diff;
}

public static Calendar getCalendar(Date date) {
    Calendar cal = Calendar.getInstance(Locale.US);
    cal.setTime(date);
    return cal;
}
Run Code Online (Sandbox Code Playgroud)

同样,您可能只需比较时间的毫秒表示并除以一年中的毫秒数。只需将所有内容保留为长整型,在大多数情况下(闰年,哎哟)就足够了,但这取决于您的应用程序的年数以及该函数的性能必须如何,是否值得进行这种黑客攻击。