根据出生日期计算出年龄组内的年龄和地点
我正在开发一个比赛包围应用程序,需要将某些日期进行比较,以便将它们放置在其指定的年龄组中。我似乎无法弄清楚我会如何写这样的东西。根据出生日期计算出年龄组内的年龄和地点
6 - under = 2007-09-01 to present
8 - under = 2005-09-01 to 2007-08-31
10 - under = 2003-09-01 to 20050831
会是这样的吗?有没有更好的方法来比较日期彼此。
def age_group
if self.dob <= 20030901
"10"
elsif self.dob <= 20050901
"8"
else self.dob <= 20070901
"6"
end
end
谢谢
你当然可以保持你的AGE_GROUP方法,没有什么不妥的地方。我只是调整它,像这样:
def age_group
if self.dob <= 10.years.ago
"10"
elsif self.dob <= 8.years.ago
"8"
elsif self.dob <= 6.years.ago
"6"
end
end
这不会按预期发挥功能。 10年前出生的人的出生日期将少于'6.years.ago',并且将被分类到6岁的类别中。 – 2014-09-22 20:42:14
我猜这种方法会在10年的屋顶下同时带来6.年和8年的类别? – 2014-09-22 20:47:23
感谢赶上球员,我更新了代码。 – Anthony 2014-09-22 21:02:32
如果你不喜欢这样,你将不得不每年更新的出生的截止日期。你可以计算出年龄来代替,而从那里:
def age
now = Time.now.utc.to_date
now.year - birthday.year - (birthday.to_date.change(:year => now.year) > now ? 1 : 0)
end
(以上来自Get person's age in Ruby)
然后定义年龄组:
def age_group
if self.age <= 10
"10"
elsif ...
etc.
一个case
声明会为这项工作做得很好,因为它使用===
进行比较。
require 'date'
R10U = (Date.parse("2003-09-01")..Date.parse("2005-08-31"))
R8U = (Date.parse("2005-09-01")..Date.parse("2007-08-31"))
R6U = (Date.parse("2007-09-01")..Date.today)
def age_group(dob)
case Date.parse(dob)
when R6U then "6 - under"
when R8U then "8 - under"
when R10U then "10 - under"
else raise ArgumentError, "dob = '#{dob}' is out-of-range"
end
end
age_group("2006-04-12")
#=> "8 - under"
age_group("2004-11-15")
#=> "10 - under"
age_group("2011-06-01")
#=> "6 - under"
age_group("2002-04-30")
#=> ArgumentError: dob = '2002-04-30' is out-of-range
age_group("2015-06-01")
#=> ArgumentError: dob = '2015-06-01' is out-of-range
为什么返回一个只包含一个Integer的字符串,当方法的名称暗示返回的类型是Integer? – MrYoshiji 2014-09-22 20:38:49
你好 - 我的答案是否为你解决这个问题? – Anthony 2014-09-24 00:45:19