-5

由于似乎人们更关心投票而不是阅读实际问题,所以我应该得到的值在底部框中,我的问题就在它下面

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

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 都是正确的。正确的值(截至今天,2015 年 9 月 12 日)是:

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

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

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

4

3 回答 3

2

如果您尝试滚动自己的日期/时间算法,您总会遇到问题。使用 JDK、java.util.Calendar 和新的 java.time 包或 Joda Time 等库提供的功能。尝试:

Period.between(date-of-birth , today's date).
于 2015-12-09T15:55:26.417 回答
1

Aleksandar 已经解释了您使用解决方案遇到的问题。

使用 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
于 2015-12-09T15:54:37.143 回答
0

很难轻易解释你做错了什么。常识说它应该起作用,但我认为这个视频在世界上解释得最好。

简而言之,闰秒有问题,有些年份有 366 天,这取决于第一个和第二个日期的时区,有些年份显然甚至不存在整体:-)。

我不知道你是否一定要使用你正在使用的 API,它是 Java 8 之前的 API。尽管人们对此答案过敏,但您确实应该为此使用图书馆,例如Joda Time。更好的是,如果您可以迁移到使用 Java 8 和新 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
于 2015-12-09T15:50:18.783 回答