如何找到两个日期之间的年数?

新手上路,请多包涵

我想确定从某个日期开始的年龄。有谁知道在 Android 中执行此操作的干净方法?显然我有可用的 Java api,但直接的 java api 非常薄弱,我希望 Android 能帮我解决问题。

编辑:由于 Android Java - Joda Date 速度慢 和相关问题,在 Android 中使用 Joda time 的多项建议让我有点担心。此外,为这种大小的东西引入平台未附带的库可能有点矫枉过正。

原文由 Micah Hainline 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 572
2 个回答
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 VV 所注意到的,由于日历的工作方式,这不适用于基督之前的日期。

原文由 sinuhepop 发布,翻译遵循 CC BY-SA 4.0 许可协议

tl;博士

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

零年的测试过去了,一年过去了。

 ChronoUnit.YEARS.between(
    LocalDate.of( 2010 , 1 , 1 )  ,
    LocalDate.of( 2010 , 6 , 1 )
)

0

 ChronoUnit.YEARS.between(
    LocalDate.of( 2010 , 1 , 1 )  ,
    LocalDate.of( 2011 , 1 , 1 )
)

1个

请参阅 在 Ideone.com 上运行的这段代码

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


Java 中所有日期时间类型的表,包括现代的和传统的


关于 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 类?

哪个 java.time 库与哪个版本的 Java 或 Android 一起使用的表

原文由 Basil Bourque 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题