2015-09-24 3 views
3

Я пытаюсь рассчитать возраст в java, который учитывает месяцы, поэтому просто вычитание лет не будет работать. Я также хочу сказать пользователю, если сегодня их день рождения. Вот код, который у меня есть до сих пор, но я боюсь, что это немного. Он также не скажет, является ли сегодня днем ​​рождения, хотя две даты, которые он сравнивает, равны. То, как я попытался первоначально рассчитать, - использовать миллисекунды. Причина, по которой вы видите два способа получить текущую дату, состоит в том, что я пытался что-то заставить ее работать, но хотел показать всем свою работу, чтобы они могли указать мне в правильном направлении.Как я могу точно рассчитать возраст в Java Дата рождения

EDIT FOR CLARIFICATION Я имею в виду, что 2015-1993 года может быть 22 года или 21, если их день рождения уже прошел в этом году. Я хочу быть уверенным, что я правильно понял этот возраст.

public class ShowAgeActivity extends AppCompatActivity { 

private TextView usersAge; 

private static long daysBetween(Date one, Date two) 
{ 
    long difference = (one.getTime()-two.getTime())/86400000; return Math.abs(difference); 
} 

private Date getCurrentForBirthday() 
{ 
    Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay"); 
    int birthdayYear = birthday.getYear() + 1900; 
    Calendar cal = Calendar.getInstance(); 
    cal.set(birthdayYear, Calendar.MONTH, Calendar.DAY_OF_MONTH); 
    Date current = cal.getTime(); 
    return current; 
} 


protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_show_age); 


    Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay"); 
     Date currentDay = Calendar.getInstance().getTime(); 

     long age = daysBetween(birthday,currentDay)/365; 

     usersAge =(TextView)findViewById(R.id.ageTextView); 

    if (birthday.compareTo(getCurrentForBirthday()) == 0) 
    { 
     usersAge.setText("It is your birthday, and your Age is " + String.valueOf(age)); 
    } 

    usersAge.setText("Your Age is " + String.valueOf(age)); 


    } 

}

+2

уточнить, что вы подразумеваете под «счет в течение нескольких месяцев» вы хотите возраст быть 22yrs и 4 месяца, или вы просто означает, 2015-1993 может быть либо 22 лет или 21 в зависимости, если их день рождения уже прошло в этом году –

+0

извинения. я имею в виду, что в 2015-1993 годах может быть 22 года или 21 год, если их день рождения уже прошел в этом году. – alphamalle

+0

@alphamalle. Пожалуйста, размещайте такую ​​дополнительную информацию или пояснения как изменение своего Вопроса, а не как комментарий. Не заставляйте ваших читателей работать так усердно. –

ответ

7

Ниже приведен пример того, как вычислить возраст человека, если сегодня их день рождения, а также, сколько дней осталось до их рождения, если сегодня не их день рождения с помощью нового java.time, которые были включены в состав Java 8.

LocalDate today    = LocalDate.now(); 
    LocalDate birthday   = LocalDate.of(1982, 9, 26); 
    LocalDate thisYearsBirthday = birthday.with(Year.now()); 

    long age = ChronoUnit.YEARS.between(birthday, today); 

    if (thisYearsBirthday.equals(today)) 
    { 
    System.out.println("It is your birthday, and your Age is " + age); 
    } 
    else 
    { 
    long daysUntilBirthday = ChronoUnit.DAYS.between(today, thisYearsBirthday); 
    System.out.println("Your age is " + age + ". " + daysUntilBirthday + " more days until your birthday!"); 
    } 
+0

Im пытается заставить это работать, но chronounit не может быть разрешен. Я использую jdk 8. – alphamalle

+0

Добавьте этот импорт: import java.time.temporal.ChronoUnit; – Nate

+0

, который зафиксировал его. Не уверен, почему, но он не смог разрешить импорт до тех пор, пока я не восстановил дважды в студии Android. – alphamalle

3

Это код, который я использую, чтобы выяснить, сколько лет прошло.

Long time= currentDate.getTime/1000 - birthdate.getTime/1000 

int years = Math.round(time)/31536000; 
int months = Math.round(time - years * 31536000)/2628000; 
+0

Это самый простой ответ, который делает правильный возраст. – alphamalle

2

Answer by Nate хорошее. Но он игнорирует вопрос о часовом поясе. И возможен более явный подход.

часового пояса

Временная зона имеет решающее значение в определении даты. Например, в Париже новый день предстает перед Парижем, чем в Монреале.

Если опустить, текущий часовой пояс JVM используется по умолчанию. Я предлагаю вам вместо этого указать часовой пояс, который вы ожидаете/желаете.

Используйте proper time zone name, тип континента/города. Никогда не используйте 3-4 буквенных кода, таких как «EST» или «IST».

java.time

Рамка java.time (Tutorial), встроенная в Java 8, а затем включает Period класса для представления промежуток времени в сочетании ряда лет, количестве месяцев, и количестве дней ,

Вы можете запросить Period для извлечения каждого из этих трех компонентов.

Метод периода toString по умолчанию генерирует строку в формате, определяемом ISO 8601, где P отмечает начало, за которым следуют цифры и буквы три раза. Например, полтора года: P1Y6M.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(zoneId); 
LocalDate birthdate = LocalDate.of(1960 , 2 , 17); 
Period p = Period.between(birthdate , today); 
String output = p.toString(); 
Integer age = p.getYears(); 
Boolean isTodayBirthday = ((p.getMonths() == 0) && (p.getDays() == 0)); 

Другой подход использует MonthDay класс для представления в месяц-день без года.

Boolean isBirthdayToday = 
    MonthDay.from(birthdate) 
      .equals(MonthDay.from(today)) ; 

Android

для Android, вы не имеете технологии Java 8, такие как java.time.

Вы можете найти некоторые проекты, которые поддерживают java.time-классы. Я не знаю, насколько они успешны.

Кроме того, вы можете использовать стороннюю библиотеку Joda-Time, которая вдохновила инфраструктуру java.time (JSR 310). Код Joda-Time должен быть аналогичен приведенному выше. За исключением того, что класс Period имеет более точное разрешение, он переходит в часы, минуты и секунды. Чтобы усечь эти дополнительные данные, вызовите метод withTimeAtStartOfDay.

1

Это работает для меня.

Calendar currentDate = Calendar.getInstance(); 

SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); 

Date birthdate = null; 

try { 
    birthdate = myFormat.parse(yourDate); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

Long time= currentDate.getTime().getTime()/1000 - birthdate.getTime()/1000; 

int years = Math.round(time)/31536000; 
int months = Math.round(time - years * 31536000)/2628000; 
+0

FYI, неприятные старые классы времени, такие как ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [ 'java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) и' java.text.SimpleTextFormat' теперь [legacy] (https://en.wikipedia.org/wiki/Legacy_system), вытесненный [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary. html). –

+0

Благодарим вас за информацию, они должны отметить это как устаревшее. В любом случае это было самым простым решением для моей проблемы. –

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

  • Нет связанных вопросов^_^