복붙노트

[RUBY-ON-RAILS] 루비 사람의 나이를 받기

RUBY-ON-RAILS

루비 사람의 나이를 받기

나는 그것의 생일에서 사람의 나이를 좀하고 싶습니다. - 지금 몇 년 366 일이 있기 때문에 생일 / 365,하지 작업을 수행합니다. 나는 다음과 같은 코드를 함께했다 :

now = Date.today
year = now.year - birth_date.year

if (date+year.year) > now
  year = year - 1
end

나이를 계산하는 더 Ruby'ish 방법이 있나요?

해결법

  1. ==============================

    1.나는 여기에 파티에 늦었 알고 있지만, 윤년에 29 2 월 태어난 사람의 나이를 해결하려고 할 때 허용 대답은 끔찍하게 파괴됩니다. (: 년 => now.year) 잘못된 날짜를 생성 birthday.to_date.change에 대한 호출이 있기 때문이다.

    나는 여기에 파티에 늦었 알고 있지만, 윤년에 29 2 월 태어난 사람의 나이를 해결하려고 할 때 허용 대답은 끔찍하게 파괴됩니다. (: 년 => now.year) 잘못된 날짜를 생성 birthday.to_date.change에 대한 호출이 있기 때문이다.

    내가 대신 다음 코드를 사용 :

    require 'date'
    
    def age(dob)
      now = Time.now.utc.to_date
      now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
    end
    
  2. ==============================

    2.나는이 솔루션은 잘 작동하고 다른 사람들이 읽을 수 발견했습니다 :

    나는이 솔루션은 잘 작동하고 다른 사람들이 읽을 수 발견했습니다 :

        age = Date.today.year - birthday.year
        age -= 1 if Date.today < birthday + age.years #for days before birthday
    

    쉽고 당신은 윤년 및 처리에 대해 걱정할 필요가 없습니다.

  3. ==============================

    3.이 옵션을 사용합니다 :

    이 옵션을 사용합니다 :

    def age
      now = Time.now.utc.to_date
      now.year - birthday.year - (birthday.to_date.change(:year => now.year) > now ? 1 : 0)
    end
    
  4. ==============================

    4.루비 온 레일즈 (ActiveSupport)의 한 라이너. 핸들 년, 도약 초 모든 도약.

    루비 온 레일즈 (ActiveSupport)의 한 라이너. 핸들 년, 도약 초 모든 도약.

    def age(birthday)
      (Time.now.to_s(:number).to_i - birthday.to_time.to_s(:number).to_i)/10e9.to_i
    end
    

    여기에서 논리 - C #에서 계산 시대

    모두 그리고 to_s () 전) (UTC 호출 할 경우 두 날짜, 같은 시간대에있는 가정.

  5. ==============================

    5.

    (Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
    
  6. ==============================

    6.대답은 지금까지 좀 이상한입니다. 원래 시도는이 작업을 수행하는 올바른 방법에 꽤 가까이 :

    대답은 지금까지 좀 이상한입니다. 원래 시도는이 작업을 수행하는 올바른 방법에 꽤 가까이 :

    birthday = DateTime.new(1900, 1, 1)
    age = (DateTime.now - birthday) / 365.25 # or (1.year / 1.day)
    

    당신은 너무 to_i와 정수로 결과를 변환 주시기, 분수 결과를 얻을 것이다. 올바르게 행사하기 때문에 (관련 시간 클래스의 경우 또는 초) 날짜 일 단위로 측정 기간 등의 차이를 취급하기 때문에 더 나은 솔루션입니다. 그런 다음 해의 일수에 의한 간단한 부문은 당신에게 나이를 제공합니다. 몇 년 동안 이런 식으로 나이를 계산할 때, 한 원래 DOB 값을 유지으로, 어떤 수당은 윤년 할 필요가 없습니다.

  7. ==============================

    7.나의 제안:

    나의 제안:

    def age(birthday)
        ((Time.now - birthday.to_time)/(60*60*24*365)).floor
    end
    

    트릭은 시간과 빼기 작업이 초를 반환한다는 것입니다

  8. ==============================

    8.이 답변은 대신을 upvote에, 최고입니다.

    이 답변은 대신을 upvote에, 최고입니다.

    philnash의 솔루션 @처럼 나는, 그러나 조건이 조밀하게 될 수 있습니다. 무슨 부울 표현하는 일은 하나 그냥 루비의 문자열 비교를 대신 사용할 수 있도록 사전 식 순서를 사용하여 [월, 일] 쌍을 비교하는 것입니다 :

    def age(dob)
      now = Date.today
      now.year - dob.year - (now.strftime('%m%d') < dob.strftime('%m%d') ? 1 : 0)
    end
    
  9. ==============================

    9.난이게 좋아:

    난이게 좋아:

    now = Date.current
    age = now.year - dob.year
    age -= 1 if now.yday < dob.yday
    
  10. ==============================

    10.이것은이 답변 (이 투표를 많이받은 것)의 전환이다 :

    이것은이 답변 (이 투표를 많이받은 것)의 전환이다 :

    # convert dates to yyyymmdd format
    today = (Date.current.year * 100 + Date.current.month) * 100 + Date.today.day
    dob = (dob.year * 100 + dob.month) * 100 + dob.day
    # NOTE: could also use `.strftime('%Y%m%d').to_i`
    
    # convert to age in years
    years_old = (today - dob) / 10000
    

    이 접근 방식에서 확실히 독특한하지만 당신이 무엇을 깨달을 때 완벽한 의미가 있습니다 :

    today = 20140702 # 2 July 2014
    
    # person born this time last year is a 1 year old
    years = (today - 20130702) / 10000
    
    # person born a year ago tomorrow is still only 0 years old
    years = (today - 20130703) / 10000
    
    # person born today is 0
    years = (today - 20140702) / 10000  # person born today is 0 years old
    
    # person born in a leap year (eg. 1984) comparing with non-leap year
    years = (20140228 - 19840229) / 10000 # 29 - a full year hasn't yet elapsed even though some leap year babies think it has, technically this is the last day of the previous year
    years = (20140301 - 19840229) / 10000 # 30
    
    # person born in a leap year (eg. 1984) comparing with leap year (eg. 2016)
    years = (20160229 - 19840229) / 10000 # 32
    
  11. ==============================

    11.루비 레일에이 태그가 있기 때문에, dotiw 보석은 레일 distance_of_times_in_words 내장과 나이를 확인하는 데 사용할 수 있습니다 distance_of_times_in_words_hash을 제공 우선합니다. 년 2 월 29 세부 사항의 수준이 필요한 경우 보증이 이해하는 일 부분에 영향을 가지고 있음을 알고 있지만, 윤년은 세 부분에 대한 벌금을 처리됩니다. 원래 형식으로 되돌리려 모호한 옵션 : 당신이 dotiw이 distance_of_time_in_words의 형식을 변경하는 방법이 마음에 들지 않는다면 또한,의를 사용합니다.

    루비 레일에이 태그가 있기 때문에, dotiw 보석은 레일 distance_of_times_in_words 내장과 나이를 확인하는 데 사용할 수 있습니다 distance_of_times_in_words_hash을 제공 우선합니다. 년 2 월 29 세부 사항의 수준이 필요한 경우 보증이 이해하는 일 부분에 영향을 가지고 있음을 알고 있지만, 윤년은 세 부분에 대한 벌금을 처리됩니다. 원래 형식으로 되돌리려 모호한 옵션 : 당신이 dotiw이 distance_of_time_in_words의 형식을 변경하는 방법이 마음에 들지 않는다면 또한,의를 사용합니다.

    Gemfile에 dotiw 추가

    gem 'dotiw'
    

    명령 행에서 :

    bundle
    

    distance_of_time_in_words 및 distance_of_time_in_words_hash에 액세스 할 수있는 적절한 모델의 DateHelper를 포함합니다. 이 예에서 생일 '모델은'사용자 '이며, 생일 필드입니다.

    class User < ActiveRecord::Base
      include ActionView::Helpers::DateHelper
    

    같은 모델에이 방법을 추가합니다.

    def age
      return nil if self.birthday.nil?
      date_today = Date.today
      age = distance_of_time_in_words_hash(date_today, self.birthday).fetch("years", 0)
      age *= -1 if self.birthday > date_today
      return age
    end
    

    용법:

    u = User.new("birthday(1i)" => "2011", "birthday(2i)" => "10", "birthday(3i)" => "23")
    u.age
    
  12. ==============================

    12.나는 이것이 @의 philnash의 대답은 기능적으로 동일하지만, IMO 더 쉽게 이해할 수있다 생각합니다.

    나는 이것이 @의 philnash의 대답은 기능적으로 동일하지만, IMO 더 쉽게 이해할 수있다 생각합니다.

    class BirthDate
      def initialize(birth_date)
        @birth_date = birth_date
        @now = Time.now.utc.to_date
      end
    
      def time_ago_in_years
        if today_is_before_birthday_in_same_year?
          age_based_on_years - 1
        else
          age_based_on_years
        end
      end
    
      private
    
      def age_based_on_years
        @now.year - @birth_date.year
      end
    
      def today_is_before_birthday_in_same_year?
        (@now.month < @birth_date.month) || ((@now.month == @birth_date.month) && (@now.day < @birth_date.day))
      end
    end
    

    용법:

    > BirthDate.new(Date.parse('1988-02-29')).time_ago_in_years
     => 31 
    
  13. ==============================

    13.다음은 작동하는 것 같다 (하지만이 확인 된 경우 나는 그것을 감사하겠습니다).

    다음은 작동하는 것 같다 (하지만이 확인 된 경우 나는 그것을 감사하겠습니다).

    age = now.year - bday.year
    age -= 1 if now.to_a[7] < bday.to_a[7]
    
  14. ==============================

    14.당신이 하루 이틀 걱정을하지 않는 경우, 이것은 짧은 꽤 자기 explanitory 될 것이다.

    당신이 하루 이틀 걱정을하지 않는 경우, 이것은 짧은 꽤 자기 explanitory 될 것이다.

    (Time.now - Time.gm(1986, 1, 27).to_i).year - 1970
    
  15. ==============================

    15.좋아 이것에 대해 무엇을 :

    좋아 이것에 대해 무엇을 :

    def age
      return unless dob
      t = Date.today
      age = t.year - dob.year
      b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
      age - (b4bday ? 1 : 0)
    end
    

    이것은 우리가 모델에 나이 메소드를 호출, 레일을 사용하는 가정하고,이 모델은 날짜 데이터베이스 열 생년월일 있습니다. 이 방법은 우리가 올해의 생일 전에 있는지 확인하기 위해 문자열을 사용하기 때문에 다른 답변 다르다.

    DOB가 2004년 2월 28일하고 오늘 2014년 2월 28일 경우 예를 들어, 연령은 2014 것 - 2004 (10) 수레는 0228되며 0229. b4bday는 "0228"를 것 < "0229"또는 사실. 마지막으로, 우리는 연령에서 1을 빼고 9를 얻을 것이다.

    이 두 시간을 비교하는 일반적인 방법이 될 것입니다.

    def age
      return unless dob
      t = Date.today
      age = today.year - dob.year
      b4bday = Date.new(2016, t.month, t.day) < Date.new(2016, dob.month, dob.day)
      age - (b4bday ? 1 : 0)
    end
    

    이것은 동일한 작동하지만 b4bday 라인이 너무 깁니다. 2016 년 올해도 불필요하다. 처음에 문자열 비교 결과였다.

    또한이 작업을 수행 할 수 있습니다

    Date::DATE_FORMATS[:md] = '%m%d'
    
    def age
      return unless dob
      t = Date.today
      age = t.year - dob.year
      b4bday = t.to_s(:md) < dob.to_s(:md)
      age - (b4bday ? 1 : 0)
    end
    

    당신이 레일을 사용하지 않는 경우,이 시도

    def age(dob)
      t = Time.now
      age = t.year - dob.year
      b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
      age - (b4bday ? 1 : 0)
    end
    
  16. ==============================

    16.나는 당신이 Time.zone.now.yday를 사용하여 년의 정확한 일을 얻을 수 있기 때문에, 달을 계산에 포함되지 않습니다에 많이 더 나은 것 같아요.

    나는 당신이 Time.zone.now.yday를 사용하여 년의 정확한 일을 얻을 수 있기 때문에, 달을 계산에 포함되지 않습니다에 많이 더 나은 것 같아요.

    def age
      years  = Time.zone.now.year - birthday.year
      y_days = Time.zone.now.yday - birthday.yday
    
      y_days < 0 ? years - 1 : years
    end
    
  17. ==============================

    17.이 솔루션의 레일 변화와 함께 온

    이 솔루션의 레일 변화와 함께 온

    def age(dob)
        now = Date.today
        age = now.year - dob.year
        age -= 1 if dob > now.years_ago(age)
        age
    end
    
  18. ==============================

    18.DateHelper 년 만 가져올 수 있습니다

    DateHelper 년 만 가져올 수 있습니다

    puts time_ago_in_words '1999-08-22'
    
  19. ==============================

    19.

      def computed_age
        if birth_date.present?
          current_time.year - birth_date.year - (age_by_bday || check_if_newborn ? 0 : 1)
        else
          age.presence || 0
        end
      end
    
    
      private
    
      def current_time
        Time.now.utc.to_date
      end
    
      def age_by_bday
        current_time.month > birth_date.month
      end
    
      def check_if_newborn
        (current_time.month == birth_date.month && current_time.day >= birth_date.day)
      end```
    
  20. ==============================

    20.

      def birthday(user)
        today = Date.today
        new = user.birthday.to_date.change(:year => today.year)
        user = user.birthday
        if Date.civil_to_jd(today.year, today.month, today.day) >= Date.civil_to_jd(new.year, new.month, new.day)
          age = today.year - user.year
        else
          age = (today.year - user.year) -1
        end
        age
      end
    
  21. ==============================

    21.

    Time.now.year - self.birthdate.year - (birthdate.to_date.change(:year => Time.now.year) > Time.now.to_date ? 1 : 0)
    
  22. ==============================

    22.윤년 (그리고 가정 activesupport 존재)을 설명하려면 :

    윤년 (그리고 가정 activesupport 존재)을 설명하려면 :

    def age
      return unless birthday
      now = Time.now.utc.to_date
      years = now.year - birthday.year
      years - (birthday.years_since(years) > now ? 1 : 0)
    end
    

    years_since 제대로 (생일이 02-29 인 경우) 계정이 아닌 윤년으로 취할 수있는 날짜를 수정합니다.

  23. ==============================

    23.여기에 또한 특정 날짜의 나이를 계산있게 내 솔루션입니다 :

    여기에 또한 특정 날짜의 나이를 계산있게 내 솔루션입니다 :

    def age on = Date.today
      (_ = on.year - birthday.year) - (on < birthday.since(_.years) ? 1 : 0)
    end
    
  24. ==============================

    24.나는 그러나 개월도이 처리했다. 가 된 방법이 너무 복잡합니다. I이었다 생각할 수있는 가장 간단한 방법 :

    나는 그러나 개월도이 처리했다. 가 된 방법이 너무 복잡합니다. I이었다 생각할 수있는 가장 간단한 방법 :

    def month_number(today = Date.today)
      n = 0
      while (dob >> n+1) <= today
        n += 1
      end
      n
    end
    

    당신은 12 개월과 동일한 기능을 수행 할 수 있습니다 :

    def age(today = Date.today)
      n = 0
      while (dob >> n+12) <= today
        n += 1
      end
      n
    end
    

    이 등 이십팔일과 윤년을 처리 할, 달 증가하는 Date 클래스를 사용합니다

  25. from https://stackoverflow.com/questions/819263/get-persons-age-in-ruby by cc-by-sa and MIT license