由于看起来人们更关心投票而不是阅读实际问题,因此我应该获得的值是在底部框中,我的问题就在它下面< /强>
我需要根据用户输入的出生日期和今天的日期来查找孩子的年龄。用户可以选择查看年,月,周和日的年龄。我需要确保计算占闰年。我已经阅读了几个提示不同技巧的帖子,但到目前为止,我还没有找到任何计算可靠数字的帖子。我最接近解决方案的是:
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
你会注意到我正在计算其中一些值。那是因为我正在寻找不同的答案并试图找到最佳解决方案。
如何找到正确的周数和天数?
答案 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