2015-12-09 3 views
-4

Так как кажется, люди больше обеспокоены голосование вниз, чем чтение актуального вопроса, значения I должны получать в нижнем поле, и мой вопрос прямо под нимразница Меры между датами

Мне нужно найти возраст ребенка на основе введенной пользователем даты рождения и сегодняшней даты. Пользователь имеет возможность просматривать возраст в годах, месяцах, неделях и днях. Мне нужно убедиться, что расчеты рассчитаны на високосные годы. Я прошел несколько сообщений, которые предлагают разные трюки, но до сих пор я не нашел ничего, что рассчитывало бы надежные числа. Ближайшим я пришел к решению:

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

есть вопросы? – Dima

+0

@Dima Посмотрите на последнюю коробку. Значения не совпадают с тем, что они должны быть. –

+0

Неясно, каким образом они «не выстраиваются в линию» - что, по вашему мнению, неверно, и что это должно быть? –

ответ

2

Вы всегда будете иметь проблемы, если вы пытаетесь свернуть свой собственный дата/время арифметику. Используйте функции, предоставляемые JDK, java.util.Calendar и новым пакетом java.time, или библиотекой, подобной Joda Time. Попытка:

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

Забыл отметить это как ответ, когда он был опубликован. Закончилось использование [Joda Time] (https://github.com/JodaOrg/joda-time). –

0

Трудно легко объяснить, что вы делаете неправильно. Смысл сообщества говорит, что он должен работать, но я думаю, что this video объясняет это лучше всего в мире.

Чтобы не допустить этого, у вас есть проблемы со скачком секунд, несколько лет - 366 дней, это зависит от часового пояса первой и второй даты, а некоторые годы, очевидно, даже не существуют в целом :-).

Я не знаю, вы обязаны использовать 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 
+0

На самом деле у него возникают проблемы с високосными годами, месяцами более 30 дней, более длинными/короткими чем 24h и так далее. Есть много предположений, сделанных в коде OPs, которые просто неправильны и поэтому просто не работают надёжно (может быть случай, когда эта программа выводит правильное значение для определенного ввода). –

1

проблемы вы получаете вместе с решением уже объяснена Aleksandar.

С Java 8 вы можете решить, как в этом фрагменте.

примечание: Как уже упоминалось, это не будет работать с 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

ANDROID НЕ ИМЕЕТ JAVA 8 –

+0

@ViktorYakunin Вы правы. Я пропустил этот тег. – SubOptimal

Смежные вопросы