Me gustaría saber la edad de una persona desde su cumpleaños. now - birthday / 365
no funciona, porque algunos años tienen 366 días. Se me ocurrió el siguiente código:
now = Date.today
year = now.year - birth_date.year
if (date+year.year) > now
year = year - 1
end
¿Hay alguna manera más rubí de calcular la edad?
ruby-on-rails
ruby
Mantas
fuente
fuente
Respuestas:
Sé que llego tarde a la fiesta aquí, pero la respuesta aceptada se romperá horriblemente al tratar de determinar la edad de alguien nacido el 29 de febrero en un año bisiesto. Esto se debe a que la llamada a
birthday.to_date.change(:year => now.year)
crea una fecha no válida.Usé el siguiente código en su lugar:
fuente
true
||false
?He encontrado que esta solución funciona bien y es legible para otras personas:
Fácil y no necesita preocuparse por manejar el año bisiesto y demás.
fuente
Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
.Utilizar este:
fuente
rails/activesupport
.Un trazador de líneas en Ruby on Rails (ActiveSupport). Maneja años bisiestos, segundos bisiestos y todo.
Lógica desde aquí: calcular la edad en C #
Asumiendo que ambas fechas están en la misma zona horaria, si no, llame
utc()
antesto_s()
en ambas.fuente
(Date.today.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_i
también funcionafuente
Las respuestas hasta ahora son un poco raras. Su intento original estuvo muy cerca de la forma correcta de hacer esto:
Obtendrá un resultado fraccionario, así que siéntase libre de convertir el resultado a un entero con
to_i
. Esta es una mejor solución porque trata correctamente la diferencia de fecha como un período de tiempo medido en días (o segundos en el caso de la clase de tiempo relacionada) desde el evento. Luego, una división simple por la cantidad de días en un año te da la edad. Al calcular la edad en años de esta manera, siempre que conserve el valor DOB original, no es necesario tener en cuenta los años bisiestos.fuente
birthday = DateTime.now - 1.year
me da una edad de 0. Desafortunadamente, dividir entre 365.25 es un poco impreciso.Mi sugerencia:
El truco es que la operación menos con Tiempo devuelve segundos
fuente
Me gusta este:
fuente
Esta respuesta es la mejor, vota en su lugar.
Me gusta la solución de @ philnash, pero el condicional podría ser más compacto. Lo que hace esa expresión booleana es comparar pares [mes, día] usando el orden lexicográfico , por lo que uno podría usar la comparación de cadenas de rubí en su lugar:
fuente
(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
?Esta es una conversión de esta respuesta (ha recibido muchos votos):
Definitivamente es único en su enfoque, pero tiene mucho sentido cuando te das cuenta de lo que hace:
fuente
Debido a que Ruby on Rails está etiquetado, la gema dotiw anula la distancia incorporada de Rails distance_of_times_in_words y proporciona distance_of_times_in_words_hash que se puede usar para determinar la edad. Los años bisiestos se manejan bien para la parte de años, aunque tenga en cuenta que el 29 de febrero tiene un efecto en la parte de días que garantiza la comprensión si se necesita ese nivel de detalle. Además, si no le gusta cómo dotiw cambia el formato de distance_of_time_in_words, use la opción: vague para volver al formato original.
Agregue dotiw al Gemfile:
En la línea de comando:
Incluya el DateHelper en el modelo apropiado para obtener acceso a distance_of_time_in_words y distance_of_time_in_words_hash. En este ejemplo, el modelo es 'Usuario' y el campo de cumpleaños es 'cumpleaños'.
Agregue este método a ese mismo modelo.
Uso:
fuente
Creo que esto es funcionalmente equivalente a la respuesta de @ philnash, pero la OMI es más fácil de entender.
Uso:
fuente
Lo siguiente parece funcionar (pero agradecería si estuviera marcado).
fuente
Si no te importa un día o dos, esto sería más corto y bastante claro.
fuente
Ok, ¿qué pasa con esto?
Esto supone que estamos usando rieles, llamando al
age
método en un modelo, y el modelo tiene una columna de base de datos de fechasdob
. Esto es diferente de otras respuestas porque este método usa cadenas para determinar si estamos antes del cumpleaños de este año.Por ejemplo, si
dob
es 2004/2/28 ytoday
es 2014/2/28,age
será2014 - 2004
o10
. Las carrozas serán0228
y0229
.b4bday
será"0228" < "0229"
otrue
. Por último, vamos a restar1
deage
y obtener9
.Esta sería la forma normal de comparar las dos veces.
Esto funciona igual, pero la
b4bday
línea es demasiado larga. El2016
año también es innecesario. La comparación de cadenas al principio fue el resultado.También puedes hacer esto
Si no estás usando rieles, prueba esto
👍🏼
fuente
Creo que es mucho mejor no contar meses, porque puedes obtener el día exacto de un año usando
Time.zone.now.yday
.fuente
Se le ocurrió una variación de Rails de esta solución
fuente
DateHelper puede usarse solo para obtener años
fuente
fuente
fuente
fuente
Para contabilizar los años bisiestos (y suponiendo una presencia activa de apoyo):
years_since
modificará correctamente la fecha para tener en cuenta los años no bisiestos (cuando es el cumpleaños02-29
).fuente
Aquí está mi solución que también permite calcular la edad en una fecha específica:
fuente
Tuve que lidiar con esto también, pero durante meses. Se volvió demasiado complicado. La forma más simple en que podía pensar era:
Podrías hacer lo mismo con 12 meses:
Esto usará la clase Fecha para incrementar el mes, que tratará con 28 días y año bisiesto, etc.
fuente