Obtenez de l'âge de la personne en Ruby
J'aimerais avoir l'âge de la personne de son anniversaire. now - birthday /365
ne fonctionne pas, parce que quelques années de 366 jours. Je suis venu avec le code suivant:
now = Date.today
year = now.year - birth_date.year
if (date+year.year) > now
year = year - 1
end
Est-il plus Ruby new'ish façon de calculer l'âge?
- Double de stackoverflow.com/questions/9/...
- pas vraiment, cette question est pour C#
- J'aime cette question, car elle met en évidence l'idée qu'il y a "plus de Rubis" et "moins Ruby" façons de faire les choses. Il est important de ne pas seulement être logiquement correcte, ce qui vous pourriez être en copiant le C# de réponse), mais aussi stylistiquement correct. Et Adinochestva la réponse de fait bon usage de Ruby idiome.
- Vous devez mettre à jour les accepté de répondre à la réponse de @philnash. Sa prend en compte les années bissextiles.
Vous devez vous connecter pour publier un commentaire.
Je sais je suis en retard pour la fête ici, mais le a accepté de répondre à cassera horriblement lorsque vous essayez de déterminer l'âge de quelqu'un qui est né le 29 février 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 (dans un des Rails de projet) à la place:
now = Date.today
troptrue
||false
?J'ai trouvé que cette solution fonctionne bien et être lisible pour les autres personnes:
Facile et vous n'avez pas besoin de s'inquiéter à propos de la manipulation de l'année bissextile et ces.
Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
.birthday + 10.years
calcule en 2014-02-28. Il n'y a pas une seule “bonne” mise en œuvre de Date#+ lorsque le résultat est un saut de jour dans un non bissextile.Utiliser ceci:
rails/activesupport
.Une doublure en Ruby on Rails (ActiveSupport). Les poignées des années bissextiles, les secondes intercalaires et tous.
Logique à partir d'ici - Calcul de l'âge en C#
en Supposant que les deux dates sont dans le même fuseau horaire, si pas d'appel
utc()
avantto_s()
sur les deux.(Date.today.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_i
fonctionne aussiLes réponses sont un peu bizarre. L'original de votre tentative était assez proche de la bonne façon de le faire:
Vous obtiendrez un résultat fractionnaire, alors n'hésitez pas à convertir le résultat d'un nombre entier avec
to_i
. C'est une meilleure solution, car il traite correctement la date de la différence comme une période de temps mesuré en jours (voire quelques secondes, dans le cas du Temps de la classe) depuis l'événement. Alors qu'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, aussi longtemps que vous conservez l'original date de naissance de valeur, pas d'allocation doit être faite pour les années bissextiles.birthday = DateTime.now - 1.year
me donne un âge de 0. Malheureusement, en divisant par 365.25 est un peu imprécise.DateTime
a été mis en œuvre correctement, mais on dirait qu'il suppose 365 jours tous les ans. En divisant par365.0
semble produire le bon numéro.Ma suggestion:
Le truc, c'est que le moins opération avec le Temps renvoie secondes
J'aime celui-ci:
Cette réponse est le meilleur, upvote à la place.
J'aime @philnash de la solution, mais la condition peut être compacteur. Ce que l'expression booléenne n'est en comparant [du mois, du jour] les paires en utilisant l'ordre lexicographique, donc on pourrait simplement utiliser ruby comparaison de chaînes de caractères à la place:
(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
?C'est une conversion de cette réponse (il a reçu un grand nombre de votes):
C'est unique dans son approche, mais tout à fait logique quand on sait ce qu'il fait:
Parce que Ruby on Rails est balisé, la dotiw gem remplace les Rails intégrés dans distance_of_times_in_words et fournit distance_of_times_in_words_hash qui peut être utilisé pour déterminer l'âge. Les années bissextiles sont traitées amende pour les années partie bien être conscient que le 29 Février n'ont un effet sur les jours de la portion de bons de souscription à comprendre si ce niveau de détail est nécessaire. Aussi, si vous n'aimez pas la façon dont dotiw de changer le format de distance_of_time_in_words, utiliser le :vague d'option pour rétablir le format d'origine.
Ajouter dotiw dans le Gemfile:
Sur la ligne de commande:
Inclure la 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 "User" et le champ anniversaire est l'anniversaire de.
Ajouter cette méthode pour ce même modèle.
Utilisation:
Je crois que c'est fonctionnellement équivalent à @philnash réponse, mais IMO plus facilement compréhensible.
Utilisation:
La suite semble fonctionner (mais je l'apprécierais si il a été vérifié).
Si vous n'avez pas de soins sur une journée ou deux, ce serait plus courte et assez auto-explanitory.
Ok, qu':
C'est en supposant que nous sommes à l'aide de rails, l'appel de la
age
méthode sur un modèle, et le modèle a une base de colonnedob
. Ceci est différent des autres réponses, car cette méthode utilise des chaînes de déterminer si nous sommes avant cette année d'anniversaire.Par exemple, si
dob
est 2004/2/28 ettoday
est 2014/2/28,age
sera2014 - 2004
ou10
. La flotte sera0228
et0229
.b4bday
sera"0228" < "0229"
outrue
. Enfin, nous l'exclurons1
deage
et obtenir9
.Ce serait la voie normale pour comparer les deux heures.
Cela fonctionne de la même, mais le
b4bday
ligne est trop longue. Le2016
année est également inutile. La comparaison de chaînes de caractères au début était le résultat.Vous pouvez également le faire
Si vous n'êtes pas à l'aide de rails, essayez cette
Je pense que c'est beaucoup mieux de ne pas compter les mois, parce que vous pouvez obtenir exactement le jour de l'an en utilisant
Time.zone.now.yday
.Est venu avec un Rails de variation de cette solution
DateHelper peut être utilisé pour obtenir des années seulement
En compte les années bissextiles (et en supposant activesupport présence):
years_since
va modifier correctement la date à prendre en compte les années bissextiles (lors de l'anniversaire est02-29
).Voici ma solution qui permet également de calculer l'âge à une date précise:
J'ai eu à traiter avec cela aussi, mais pendant des mois. Est devenu trop compliqué. La façon la plus simple que je pouvais penser était:
On pourrait faire la même avec 12 mois:
Cela permettra d'utiliser la classe Date pour incrémenter le mois, qui traitera de 28 jours et de l'année bissextile, etc.