J'aimerais connaître l'âge d'une personne à partir de son anniversaire. now - birthday / 365
ne fonctionne pas, car certaines années ont 366 jours. J'ai trouvé le code suivant:
now = Date.today
year = now.year - birth_date.year
if (date+year.year) > now
year = year - 1
end
Existe-t-il une manière plus rubis de calculer l'âge?
ruby-on-rails
ruby
Les mantas
la source
la source
Réponses:
Je sais que je suis en retard à la fête ici, mais la réponse acceptée se brisera horriblement en essayant de déterminer l'âge d'une personne née le 29 février lors d'une année bissextile. C'est parce que l'appel à
birthday.to_date.change(:year => now.year)
crée une date non valide.J'ai utilisé le code suivant à la place:
la source
true
||false
?J'ai trouvé que cette solution fonctionnait bien et était lisible pour d'autres personnes:
Facile et vous n'avez pas à vous soucier de la gestion des années bissextiles et autres.
la source
Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
.Utilisez ceci:
la source
rails/activesupport
.Une doublure en Ruby on Rails (ActiveSupport). Gère les années bissextiles, les secondes bissextiles et tout.
Logique à partir d'ici - Calculer l'âge en C #
En supposant que les deux dates sont dans le même fuseau horaire, sinon appeler
utc()
avantto_s()
les deux.la source
(Date.today.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_i
fonctionne aussila source
Les réponses jusqu'à présent sont un peu bizarres. Votre tentative initiale était assez proche de la bonne façon de procéder:
Vous obtiendrez un résultat fractionnaire, alors n'hésitez pas à convertir le résultat en entier avec
to_i
. C'est une meilleure solution car elle traite correctement la différence de date comme une période de temps mesurée en jours (ou en secondes dans le cas de la classe Time associée) depuis l'événement. Ensuite, une simple division par le nombre de jours dans une année vous donne l'âge. Lors du calcul de l'âge en années de cette façon, tant que vous conservez la valeur DOB d'origine, aucune allocation n'est nécessaire pour les années bissextiles.la source
birthday = DateTime.now - 1.year
me donne un âge de 0. Malheureusement, diviser par 365,25 est un peu imprécis.Ma suggestion:
L'astuce est que l'opération moins avec Time renvoie des secondes
la source
J'aime celui la:
la source
Cette réponse est la meilleure, votez-la plutôt.
J'aime la solution de @ philnash, mais le conditionnel pourrait être plus compact. Cette expression booléenne compare les paires [mois, jour] en utilisant l' ordre lexicographique , donc on pourrait simplement utiliser la comparaison de chaînes de ruby à la place:
la source
(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
?Ceci est une conversion de cette réponse (elle a reçu beaucoup de votes):
C'est vraiment unique dans son approche, mais cela prend tout son sens lorsque vous réalisez ce qu'il fait:
la source
Comme Ruby on Rails est balisé, le gem dotiw remplace le paramètre distance_of_times_in_words intégré à Rails et fournit distance_of_times_in_words_hash qui peut être utilisé pour déterminer l'âge. Les années bissextiles sont traitées correctement pour la partie des années, mais sachez que le 29 février a un effet sur la partie des jours qui justifie de comprendre si ce niveau de détail est nécessaire. De plus, si vous n'aimez pas la façon dont dotiw modifie le format de distance_of_time_in_words, utilisez l'option: vague pour revenir au format d'origine.
Ajoutez dotiw au Gemfile:
Sur la ligne de commande:
Incluez le DateHelper dans le modèle approprié pour accéder à distance_of_time_in_words et distance_of_time_in_words_hash. Dans cet exemple, le modèle est «Utilisateur» et le champ anniversaire est «anniversaire».
Ajoutez cette méthode à ce même modèle.
Usage:
la source
Je pense que c'est fonctionnellement équivalent à la réponse de @ philnash, mais l'OMI est plus facilement compréhensible.
Usage:
la source
Ce qui suit semble fonctionner (mais je l'apprécierais s'il était vérifié).
la source
Si vous ne vous souciez pas d'un jour ou deux, ce serait plus court et assez explicite.
la source
Ok et ça:
Cela suppose que nous utilisons des rails, appelons la
age
méthode sur un modèle, et que le modèle a une colonne de base de données de datesdob
. Ceci est différent des autres réponses car cette méthode utilise des chaînes pour déterminer si nous sommes avant l'anniversaire de cette année.Par exemple, si
dob
est 2004/2/28 ettoday
2014/2/28,age
sera2014 - 2004
ou10
. Les flotteurs seront0228
et0229
.b4bday
sera"0228" < "0229"
outrue
. Enfin, nous déduisons1
deage
et obtenir9
.Ce serait la manière normale de comparer les deux temps.
Cela fonctionne de la même manière, mais la
b4bday
ligne est trop longue. L'2016
année est également inutile. La comparaison de chaînes au début était le résultat.Vous pouvez également le faire
Si vous n'utilisez pas de rails, essayez ceci
👍🏼
la source
Je pense qu'il est préférable de ne pas compter les mois, car vous pouvez obtenir le jour exact de l'année en utilisant
Time.zone.now.yday
.la source
Est venu avec une variante Rails de cette solution
la source
DateHelper peut être utilisé pour obtenir des années uniquement
la source
la source
la source
la source
Pour tenir compte des années bissextiles (et en supposant une présence active de soutien):
years_since
modifiera correctement la date pour prendre en compte les années non bissextiles (date de l'anniversaire02-29
).la source
Voici ma solution qui permet également de calculer l'âge à une date précise:
la source
J'ai dû faire face à ça aussi, mais pendant des mois. Est devenu beaucoup trop compliqué. Le moyen le plus simple auquel je pouvais penser était:
Vous pourriez faire la même chose avec 12 mois:
Cela utilisera la classe Date pour incrémenter le mois, ce qui traitera 28 jours et une année bissextile, etc.
la source