如何查找两个日期之间的年数?tl;博士java.time关于 java.time
我试图从某个日期开始以年为单位确定年龄。有谁知道在Android中做到这一点的干净方法吗?我显然有Java API可用,但直接的java api非常弱,我希望Android有一些东西可以帮助我。
编辑:由于Android Java,在Android中使用Joda时间的多个建议让我有点担心 - Joda Date很慢,并且存在相关问题。此外,为这种尺寸的东西拉入一个没有随平台一起提供的库可能是过度的。
我试图从某个日期开始以年为单位确定年龄。有谁知道在Android中做到这一点的干净方法吗?我显然有Java API可用,但直接的java api非常弱,我希望Android有一些东西可以帮助我。
编辑:由于Android Java,在Android中使用Joda时间的多个建议让我有点担心 - Joda Date很慢,并且存在相关问题。此外,为这种尺寸的东西拉入一个没有随平台一起提供的库可能是过度的。
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.所注意到的,由于日历的工作方式,这不适用于基督之前的日期。
ChronoUnit.YEARS.between(
LocalDate.of( 2010 , 1 , 1 ) ,
LocalDate.now( ZoneId.of( "America/Montreal" ) )
)
旧的日期时间类真的很糟糕,以至于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
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 类?