2010-10-24 14 views
2

J'ai un objet de date qui tient un anniversaire de personnes. Mon code ressemble à:Essayer de calculer l'âge dans groovy

def getAge(){ 
    //birthday, birthYear, birthMonth, birthDayOfMonth are class level properties 
    def c= new GregorianCalendar(birthYear, birthMonth-1, birthDayOfMonth) 
    birthday = c.time 
    //What do I do now? 
} 

Je dois retourner l'âge de la personne. Comment je fais ça dans Groovy? L'âge doit seulement être un nombre entier.

Répondre

6

Vous pouvez simplement créer un calendrier avec la date et utiliser l'année pour calculer l'âge:

def now = new GregorianCalendar() 
def fake = new GregorianCalendar(now.get(Calendar.YEAR), birthMonth-1, birthDayOfMonth) 
return now.get(Calendar.YEAR) - birthYear - (fake > now ? 1 : 0) 

la date fausse est utilisée pour comprendre si anniversaire est déjà passé dans l'année en cours, si ce n'est pas vous doit Soustraire1 à la différence entre les années ..

3

Je sais que c'est question est vieux, mais il m'a inspiré pour créer cette fonction, en travaillant sur les dates:

static Integer calculateAge(Date birthday, Date offset = new Date()) { 
    def birthdayThisYear = offset.clone().clearTime() 
    birthdayThisYear[MONTH]= birthday[MONTH] 
    birthdayThisYear[DATE] = birthday[DATE] 

    offset[Calendar.YEAR] - birthday[Calendar.YEAR] - (birthdayThisYear > offset ? 1 : 0) 
} 

Vous pouvez soit l'appeler avec l'anniversaire seul pour calculer l'âge aujourd'hui, ou avec un second argument, étant la date à laquelle vous voulez calculer l'âge des personnes.

+0

+1; Notez que si vous utilisez une version plus ancienne de groovy, vous devrez mettre 'clearTime()' sur une ligne séparée, car cela n'a pas retourné l'objet date jusqu'à la version 1.8 ou plus. –

0
Date.metaClass.calculateAge = { Date offset = new Date() -> 
     def birthdayThisYear = offset.clone().clearTime() 
     birthdayThisYear[Calendar.MONTH]= delegate[Calendar.MONTH] 
     birthdayThisYear[Calendar.DATE] = delegate[Calendar.DATE] 
     return offset[Calendar.YEAR] - delegate[Calendar.YEAR] - (birthdayThisYear > offset ? 1 : 0) 
    } 

exemple d'utilisation:

def dateParser = new java.text.SimpleDateFormat("yyyy-MM-dd") 
dateParser.lenient = false 

dateParser.parse('1980-02-23').calculateAge()