测量日期之间的差异

Measure difference between dates

因为人们似乎更关心投票否决而不是阅读实际问题,所以我应该得到的值在底部的框中​​,并且我的问题就在下面

我需要根据用户输入的出生日期和今天的日期查找 child 的年龄。用户可以选择以年、月、周和天为单位查看年龄。我需要确保计算考虑到闰年。我浏览了几篇建议不同技巧的帖子,但到目前为止我还没有找到任何可以计算可靠数字的东西。我最接近的解决方案是:

final Calendar bday = Calendar.getInstance();
bday.set(1991, 3, 27);

final Calendar today = Calendar.getInstance();

int yearsDiff = today.get(Calendar.YEAR) - bday.get(Calendar.YEAR); // yearsDiff: 24

if(bday.get(Calendar.MONTH) > today.get(Calendar.MONTH) ||
        (bday.get(Calendar.MONTH) == today.get(Calendar.MONTH) && bday.get(Calendar.DATE) > today.get(Calendar.DATE))) {
    yearsDiff --;
}

final int monthsDiff = yearsDiff * 12 + today.get(Calendar.MONTH) - bday.get(Calendar.MONTH); // monthsDiff: 296

final long timeOne = bday.getTime().getTime();
final long timeTwo = today.getTime().getTime();
final long oneDay = 1000 * 60 * 60 * 24;
final long delta = (timeTwo - timeOne) / oneDay;

final long year = delta / 365; // year: 24
final long rest = delta % 365; // rest: 232 delta: 8992
final long month = rest / 30;  // month: 7
final long rest2 = rest % 30;  // rest2: 22 rest: 232
final long weeks = rest2 / 7;  // weeks: 3
final long days = rest2 % 7;   // days: 1 rest2: 22

yearsDiff 和 monthsDiff 都是正确的。正确的值(截至今天,12-09-2015)是:

 years: 24
months: 296
 weeks: 1289
  days: 9023

您会注意到我正在计算其中一些值的两个不同值。那是因为我正在查看不同的答案并试图找到最佳解决方案。

如何找到正确的周数和天数?

很难简单地解释你做错了什么。常识说它应该有效,但我认为 this video 对它的解释是世界上最好的。

长话短说,闰秒有问题,有些年份有366天,这取决于第一天和第二天的时区,有些年份显然根本不存在:-) .

不知道你是不是一定要用你现在用的API,也就是pre-Java8API。虽然人们对这个答案过敏,但你真的应该为此使用一个库,比如 Joda Time. Even better, if you could possibly migrate to using Java 8, and the new API 并留下一个依赖项。

Java 8 例:

    LocalDate today = LocalDate.parse("2015-04-27");
    LocalDate bday = LocalDate.of(2013, 5, 15);
    long weeks = bday.until(today, ChronoUnit.WEEKS);
    long years = bday.until(today, ChronoUnit.YEARS);
    Period until = bday.until(today); //complex object, has multiple getters

A​​leksandar 已经解释了您在解决方案中遇到的问题。

使用 Java 8 你可以像这个片段一样解决它。

注意:如 Viktor 所述,这不适用于 Android。因此,请使用 JodaTime 寻求解决方案。

LocalDateTime birthDate = LocalDateTime.of(1991, 3, 27, 0, 0);
LocalDateTime today = LocalDateTime.now();

long years = birthDate.until(today, ChronoUnit.YEARS);
long months = birthDate.until(today, ChronoUnit.MONTHS);
long weeks = birthDate.until(today, ChronoUnit.WEEKS);
long days = birthDate.until(today, ChronoUnit.DAYS);

System.out.println("years  = " + years);
System.out.println("months = " + months);
System.out.println("weeks  = " + weeks);
System.out.println("days   = " + days);

输出

years  = 24
months = 296
weeks  = 1289
days   = 9023

如果您尝试推出自己的 date/time 算术,您总会遇到问题。使用 JDK、java.util.Calendar 和新的 java.time 包提供的功能,或者像 Joda Time 这样的库。尝试:

Period.between(date-of-birth , today's date).