衡量日期之间的差异

时间:2015-12-09 15:21:40

标签: android date date-difference

由于看起来人们更关心投票而不是阅读实际问题,因此我应该获得的值是在底部框中,我的问题就在它下面< /强>

我需要根据用户输入的出生日期和今天的日期来查找孩子的年龄。用户可以选择查看年,月,周和日的年龄。我需要确保计算占闰年。我已经阅读了几个提示不同技巧的帖子,但到目前为止,我还没有找到任何计算可靠数字的帖子。我最接近解决方案的是:

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

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

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

3 个答案:

答案 0 :(得分:2)

如果您尝试滚动自己的日期/时间算术,则始终会遇到问题。使用JDK,java.util.Calendar和新的java.time包提供的函数,或者像Joda Time这样的库。尝试:

client.DownloadData(request).SaveAs(path)

答案 1 :(得分: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

答案 2 :(得分:0)

很难轻易解释你做错了什么。 Commons sense说它应该有用,但我认为this video在世界上解释得最好。

为了保持简短,你有闰秒的问题,有些年有366天,这取决于第一和第二个日期的时区,有些年份显然甚至不存在整个:-)。< / p>

我不知道您是否一定要使用您正在使用的API,这是Java 8之前的API。虽然人们对这个答案过敏,但你真的应该使用一个库,比如Joda Time。更好的是,如果您可以迁移到使用Java 8,并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