2014-09-30 3 views
1

Это то, что я сделал, но он не принял во внимание високосные годыКак правильно рассчитать возраст в GWT?

public static int calculateAge(String yyyyMMddBirthDate){ 
    DateTimeFormat fmt = DateTimeFormat.getFormat("yyyy-MM-dd"); 
    Date birthDateDate = fmt.parse(yyyyMMddBirthDate); 
    Date nowDate=new Date(); 
    long differenceInMillis=nowDate.getTime()-birthDateDate.getTime(); 
    int days=(int)Math.abs(differenceInMillis/(1000*60*60*24)); 
    int ages=(int)days/365; 
    System.out.println(days+" days"); 


    return ages; 
} 

Я слышал, что мы должны использовать Joda время, чтобы вычислить возраст, но, кажется, GWT не поддерживает Joda время.

Можем ли мы просто использовать простой код для расчета возраста в GWT вместо использования библиотеки?

Примечание: Это вопрос GWT, а не один Java. GWT не поддерживает java.text или Joda.

+0

возможно дубликат [Как рассчитать кого-то возраста в Java?] (Http://stackoverflow.com/questions/1116123/how- do-i-calculate-someones-age-in-java) –

+0

@Jarrod, ему нужна библиотека Joda, и я не имею в своем GWT, и я не люблю ее использовать. Почему нам нужно закрыть этот вопрос? это gwt не Java – Tum

+1

@JarrodRoberson этот вопрос не является дубликатом http://stackoverflow.com/questions/1116123/how-do-i-calculate-someones-age-in-java –

ответ

-2
import java.util.*; 

public class Practice2 { 
    public static int calculateAge(String yyyyMMddBirthDate) { 
     // check the input ?    
     int birthYear = Integer.parseInt(yyyyMMddBirthDate.substring(0,4)); 
     Date nowDate = new Date(); 
     int nowYear = nowDate.getYear() + 1900; 

     //rough age and check whether need -- below 
     int roughAge = nowYear - birthYear; 

     int birthMonth = Integer.parseInt(yyyyMMddBirthDate.substring(5,7)); 
     int birthDay = Integer.parseInt(yyyyMMddBirthDate.substring(8,10)); 

     //1970-01-01T 00:00:00 
     long now = nowDate.getTime(); 
     long days = now/(3600l * 1000l * 24l); 
     int daySum = 0; 
     for(int i = 1970; i < nowYear; i ++ ){ 
      daySum = daySum + yearDays(i); 
     } 
     int[] monthDays = {31, 28 , 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
     monthDays[1] = yearDays(nowYear) - 337; 
     for(int i = 0; i < birthMonth -1; i ++){ 
      daySum = daySum + monthDays[i]; 
     } 
     daySum = daySum + birthDay; 


     if( daySum > days){ 
      roughAge--; 
     } 

     return roughAge; 
    } 

    private static int yearDays(int year) { 
     if(((year%100==0)&&(year%400==0)) 
       ||((year%100!=0)&&(year%4==0))){ 
      return 366; 
     } 
     return 365; 
    } 

    public static void main(String[] args) { 
     System.out.println(calculateAge("1990-12-30")); 
    } 
} 
+3

GWT dooes не поддерживает Java. текст и, следовательно, не могут использовать SimpleDateFormat или Calendar – Tum

+0

@Tum Новый обновленный код поможет, если вы просто возьмете високосный день. –

1

Это должно работать (даже для GWT), по крайней мере, для родов, которые после того, как около 1582:

// currentDate and birthDate are in the format yyyyMMdd 
final int age = (Integer.valueOf(currentDate) - Integer.valueOf(birthDate))/10000; 
1

Вы уже вычислили возраст в миллисекундах, но вам нужно преобразовать это к весьма произвольным западным «годам».

Лучше всего использовать библиотеку, такую ​​как JodaTime или Календарь, в которой запрограммированы эти кромки. К счастью, люди портировали ее на GWT.

См: Date time library for gwt

Update: Это действительно зависит от того, какой ответ вы хотите. Как правило, сравнение текущего года с годом рождения даст вам правильный ответ. Таким образом, если вы хотите, целые годы жил до сих пор:

Date dateBirth = ...; 
Date dateNow = new Date(); 
int yearsOld = dateNow.getYear() - dateBirth.getYear(); 

Для учета дробной год, вам необходимо проверить на високосные дни (если вы хотите день точность) или перепрыгнуть секунд (если вы хотите прыгнуть второй точность). Итак, опять же, это зависит от того, какой результат вы ищете, чего вы не сказали.

Независимо от того, это не имеет ничего общего с GWT и все, что связано с основами математики даты/времени. либо вам придется принести его через библиотеку, либо сделать это самостоятельно. Я бы предложил библиотеку, поскольку расчеты сложны. Просто загляните внутрь BaseCalendar, который использует Java.

+0

слишком сложная библиотека для простой функции, можете ли вы понять очень простой способ? – Tum

+0

@Tum см. Обновленный ответ –

+0

getYears был устаревшим, но поскольку у нас нет Календарь в GWT, так что это нормально, но int yearsOld = dateNow.getYear() - dateBirth.getYear(); только считайте годы не такими точными, как милисекунды.Например, сегодня 1Oct14, день рождения - 11 октября 1977 года, тогда он должен показать 36, но он повернулся к 37, (правильное составляет 36 лет и 8 месяцев – Tum

0

Я столкнулся с этим сегодня и вот что я придумал. Это моделирует, как я мысленно вычислял бы чей-то возраст с датой рождения. (используя com.google.gwt.i18n.shared.DateTimeFormat)

private int getAge(Date birthDate) { 
    int birthYear = Integer.parseInt(DateTimeFormat.getFormat("yyyy").format(birthDate)); 
    int birthMonth = Integer.parseInt(DateTimeFormat.getFormat("MM").format(birthDate)); 
    int birthDayOfMonth = Integer.parseInt(DateTimeFormat.getFormat("dd").format(birthDate)); 
    Date today = new Date(); 
    int todayYear = Integer.parseInt(DateTimeFormat.getFormat("yyyy").format(today)); 
    int todayMonth = Integer.parseInt(DateTimeFormat.getFormat("MM").format(today)); 
    int todayDayOfMonth = Integer.parseInt(DateTimeFormat.getFormat("dd").format(today)); 

    boolean hasHadBirthdayThisYear; 
    if (todayMonth < birthMonth) { 
     hasHadBirthdayThisYear = false; 
    } else if (todayMonth > birthMonth) { 
     hasHadBirthdayThisYear = true; 
    } else { 
     hasHadBirthdayThisYear = birthDayOfMonth <= todayDayOfMonth; 
    } 

    int age = todayYear - birthYear; 
    if (!hasHadBirthdayThisYear) { 
     age--; 
    } 
    return age; 
} 
Смежные вопросы