android - 无法在两个日期之间获取年份

标签 android date datediff

我想得到两个日期之间的年份差。这些日期之一是当前日期和时间。另一个是用户的出生日期。

我可以正确获取用户的出生日期,如下所示:1995-06-18T19:36:00.000Z

我收到这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

这是我的功能:

public int calculateAge(String comingDate)
{
    long userAge = 0;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    sdf.setTimeZone(TimeZone.getTimeZone("GMT+03:00"));
    Calendar cal = Calendar.getInstance();
    try
    {
        Date date1 = sdf.parse(sdf.format(cal.getTime()));
        Date date2 = sdf.parse(comingDate);
        userAge = (date2.getTime() - date1.getTime())/86400000;

    }
    catch (ParseException e)
    {
        e.printStackTrace();
    }

    return (int)userAge;
}

最佳答案

首先,你不需要这样做:

Date date1 = sdf.parse(sdf.format(cal.getTime()));

只是做:

Date date1 = cal.getTime();

要计算年龄,请将 date1 放在 date2 之前,否则您将得到一个负值:

userAge = (date1.getTime() - date2.getTime()) / 86400000;

使用 comingDate 作为 1995-06-18T19:36:00.000Z,我得到了结果 8050(相当于22 年),所以这似乎是正确的。

如果您想要以而不是天为单位的年龄:

userAge = (date1.getTime() - date2.getTime()) / 86400000 / 365;

结果将是 22


新的 Java 日期/时间 API

如果您愿意为您的 Android 项目添加依赖项,您可以使用 ThreeTen Backport ,Java 8 的新日期/时间类的一个很好的反向移植,以及 ThreeTenABP (更多关于如何使用它的信息 here)。

所有类都在 org.threeten.bp 包中。代码简单多了:

import org.threeten.bp.temporal.ChronoUnit;
import org.threeten.bp.Instant;
import org.threeten.bp.ZonedDateTime;

String comingDate = "1995-06-18T19:36:00.000Z";
// get the number of days between comingDate and current date (result is 8050)
int userAge = (int) ChronoUnit.DAYS.between(Instant.parse(comingDate), Instant.now()); // 8050
// get the age in years (result is 22)
userAge = (int) ChronoUnit.YEARS.between(ZonedDateTime.parse(comingDate), ZonedDateTime.now()); // 22

为了获得年数,我不得不使用 ZonedDateTime,因为有些单位不适用于 Instant

关于android - 无法在两个日期之间获取年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44891785/

相关文章:

android - 如何使用 Android 在 Google Calendar API 中创建事件

android - Gradle 安卓插件 : Hook into post-compile task for all product flavors

android - 使用未发布的 bintray Artifact

date - Java 8 LocalDateTime四舍五入到下一个X分钟

php - 在 PHP/MySQL 中使用 Week(Date) 时,如何将一周的第一天设置为星期一?

php - mysql 中的 DATE_DIFF 错误

android - Robolectric View 在恢复状态后不更新

javascript - 当前日期两次之间的时间间隔

excel - 使用 EOMONTH 系列将开始日期扩展到结束日期

mysql - Datediff & Group By 不起作用?