如何查找两个日期之间的年数?tl;博士java.time关于 java.time

2022-08-31 13:45:43

我试图从某个日期开始以年为单位确定年龄。有谁知道在Android中做到这一点的干净方法吗?我显然有Java API可用,但直接的java api非常弱,我希望Android有一些东西可以帮助我。

编辑:由于Android Java,在Android中使用Joda时间的多个建议让我有点担心 - Joda Date很慢,并且存在相关问题。此外,为这种尺寸的东西拉入一个没有随平台一起提供的库可能是过度的。


答案 1
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;
}

注意:正如Ole V.V.所注意到的,由于日历的工作方式,这不适用于基督之前的日期。


答案 2

tl;博士

ChronoUnit.YEARS.between( 
    LocalDate.of( 2010 , 1 , 1 ) , 
    LocalDate.now( ZoneId.of( "America/Montreal" ) ) 
)

java.time

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

许多java.time功能在ThreeTen-Backport中向后移植到Java 6和7,并在ThreeTenABP中进一步适应Android(请参阅如何使用...)。

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

转储到控制台。

System.out.println( "start: " + start + " | stop: " + stop + " | years: " + years ) ;

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


Table of all date-time types in Java, both modern and legacy


关于 java.time

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

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

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

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

从哪里获取 java.time 类?

Table of which java.time library to use with which version of Java or Android