রুবিতে ব্যক্তির বয়স পান


125

আমি তার জন্মদিন থেকে একজনের বয়স পেতে চাই। now - birthday / 365কিছু কাজ করে না, কারণ কিছু বছরের 366 দিন রয়েছে। আমি নিম্নলিখিত কোডটি নিয়ে এসেছি:

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

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

বয়সের হিসাব করার জন্য আরও কি রুবি'ইশ উপায় আছে?


6
আমি এই প্রশ্নটি পছন্দ করি কারণ এটি "আরও বেশি রুবি" এবং "কম রুবি" জিনিসগুলি করার উপায় রয়েছে তা এই ধারণাকে হাইলাইট করে। এটি কেবল যৌক্তিকভাবে সঠিক হওয়া গুরুত্বপূর্ণ নয় (যা আপনি সি # উত্তর অনুলিপি করেই করতে পারেন), কিন্তু স্টাইলিস্টিকালিও সঠিক। এবং অ্যাডিনোচেস্টবার উত্তরটি রুবি আইডিয়োমের ভাল ব্যবহার করে।
জেমস এ রোজেন

উত্তর:


410

আমি জানি যে আমি এখানে পার্টিতে দেরি করেছি, তবে ২৯ শে ফেব্রুয়ারি লিপ বছরে জন্ম নেওয়া কারও বয়স বাড়ানোর চেষ্টা করার সময় গ্রহণযোগ্য উত্তরগুলি ভয়াবহভাবে ভেঙে যাবে। কারণ কলটি birthday.to_date.change(:year => now.year)একটি অবৈধ তারিখ তৈরি করে।

পরিবর্তে আমি নিম্নলিখিত কোড ব্যবহার করেছি:

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

4
এটি ব্যবহার করুন, চেক-চিহ্নিত এমন নয় যা লিপ বছরগুলি পরিচালনা করতে পারে না
বিগকোড

আপনি কেন 0 ফেরান? 1 এর পরিবর্তে true|| false?
0112

1
@ অ্যালেক্স ০১১২ কারণ যে সম্মতিজনকভাবে বিভ্রান্তিকর শর্তযুক্ত ফলাফল (0 বা 1) এখন এবং জন্ম তারিখের মধ্যে বছরের পার্থক্য থেকে বিয়োগ করা হয়েছে। এই ব্যক্তিটির এখনও এই বছর তাদের জন্মদিন হয়েছে কিনা তা খুঁজে বের করার উদ্দেশ্যে এবং যদি না হয় তবে বছরের মধ্যকার পার্থক্যের চেয়ে তাদের বয়স 1 বছর কম।
ফিলানাশ

2
@andrej এখন = তারিখ.আজ আজ কাজ করে তবে মনে রাখবেন যে এটি টাইমজোন নিয়ে সমস্যাগুলি পরিচালনা করে না। রেলগুলিতে তারিখ.আজ আজ সিস্টেম টাইমজোন ভিত্তিক একটি তারিখ ফেরত দেয়। অ্যাক্টিভেকর্ড আপনার অ্যাপ্লিকেশনগুলি কনফিগার করা টাইম জোনের উপর ভিত্তি করে একটি সময় দেয়। যদি সিস্টেমের টাইমজোন আপনার অ্যাপ্লিকেশন টাইমজোন থেকে পৃথক হয় তবে আপনি কার্যকরভাবে দুটি আলাদা টাইমজোন থেকে সময়ের তুলনা করতে পারবেন যা খুব সঠিক হবে না।
প্রিয় অনউইউমেন

এটি কি আসলেই সহজ সমাধান?
মার্কো প্রিনস 11

50

আমি এই সমাধানটি ভালভাবে কাজ করার জন্য খুঁজে পেয়েছি এবং অন্যান্য লোকের জন্য পঠনযোগ্য:

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

সহজ এবং আপনার লিপ ইয়ার এবং এই জাতীয় পরিচালনা সম্পর্কে চিন্তা করার দরকার নেই।


3
এর জন্য রেলগুলির প্রয়োজন (বয়স.এয়ার্সের জন্য) তবে আপনি যদি কিছু পছন্দ করেন তবে এটির জন্য রেলগুলির প্রয়োজন হবে না Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
চক

আপনি ঠিক বলেছেন - দুঃখিত, আমি কারণেই প্রশ্নগুলি ট্যাগ করার সাথে সাথে রিলগুলি ধরে নিয়েছিলাম। তবে হ্যাঁ, কেবল রুবির জন্য সহজেই পরিবর্তিত হয়েছে।
পিজে।

1
আমি প্রথমে এটি বেছে নিয়েছিলাম কারণ এটি সবচেয়ে সুন্দর, কিন্তু উত্পাদনে, এটি প্রায়শই ভুল, কারণগুলির কারণে আমি জানি না। সময়.নু.টুক.টো_ডেট ব্যবহার করে উপরেরটি আরও ভালভাবে কাজ করছে বলে মনে হচ্ছে।
কেভিন

@ কেভিন আকর্ষণীয়। আমি নিজেই এ নিয়ে কখনও সমস্যায় পড়িনি তবে এর অর্থ এই নয় যে একটি নেই। আপনি আমাকে একটি নির্দিষ্ট উদাহরণ দিতে পারেন? আমি বাগ আছে কিনা তা জানতে চাই। ধন্যবাদ।
পিজে।

2
@ সিগভেই - এটি একটি বৈশিষ্ট্য, কোনও বাগ নয়;) মার্কিন যুক্তরাষ্ট্রে বেশিরভাগ দেশগুলিতে, আপনি যদি লিপ বাচ্চা হন তবে ২৮ তম আইনীভাবে আপনার জন্মদিনকে নন-লিপ বছরে বিবেচনা করা হয়। ব্যক্তিটি সত্যই 10 হিসাবে বিবেচিত হবে
পিজে।

33

এটা ব্যবহার কর:

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

41
জন্মদিন. টু ডেট একটি লিপ বছর এবং বর্তমান বছরটি যদি না হয় তবে এই বিরতি s বড় ঘটনা নয়, তবে এটি আমার সমস্যার কারণ হয়ে দাঁড়িয়েছে।
ফিলানাশ

1
ফিলনাশের উত্তরটি উত্সাহিত করার জন্য ডাউনভোটিং।
নিক সনেভেল্ড

2
ফিলানাশের উত্তর পছন্দ করার আরেকটি কারণ হ'ল এটি সরল পুরাতন রুবির সাথে কাজ করে, যখন গৃহীত উত্তরটি কেবল তার সাথেই কাজ করে rails/activesupport
শেলডনহ

16

রুবে অন রেলে (অ্যাক্টিভসপোর্ট) একটি লাইনার। লিপ বছর, লিপ সেকেন্ড এবং সব কিছু পরিচালনা করে।

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

এখান থেকে যুক্তিযুক্ত - সি # তে বয়স গণনা করুন

ধরে নেওয়া উভয় তারিখ একই টাইমজোন, উভয় utc()আগে কল না হলে to_s()


1
(Date.today.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_iএছাড়াও কাজ করে
গ্রান্ট হাচিনস

FWIW, তবে তারপরে "লিপ সেকেন্ড" এ আমার গ্যারান্টিটি বাতিল হয়ে যাবে guarantee ;-) (FWIW অংশ 2, রুবি যাইহোক "লিপ সেকেন্ড" সমর্থন করে না)। :-)
বিক্রান্ত চৌধুরী চৌধুরী

1
আমি কেন এটিকে নিম্নগঠিত করে দিচ্ছি তা নিশ্চিত নয়। বোঝানোর জন্য যত্ন, প্রিয় ডাউনস্টোনরা?
বিক্রত চৌধুরী চৌধুরী

@ ভিক্রান্তচৌধুরী আমি জানি না, এটি দুর্দান্ত উত্তর। পরীক্ষিত এবং কাজ করে।
হেক্টর আরডোনজ

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

সুতরাং এটি প্রতিটি মাসের 100 দিন লম্বা এবং প্রতি বছর 100 মাস দীর্ঘ হলে দিনের মধ্যে পার্থক্যটি গণনা করে। আপনি কেবল বছরের অংশটি রাখলে কোন পার্থক্য নেই।
জোনাথন এলার্ড

6

এখনও অবধি উত্তর দুরন্ত। আপনার আসল প্রচেষ্টাটি এটি করার সঠিক উপায়ে খুব কাছাকাছি ছিল:

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

আপনি একটি ভগ্নাংশের ফলাফল পাবেন, তাই ফলাফলটিকে পূর্ণসংখ্যায় রূপান্তর করতে নির্দ্বিধায় to_i। এটি একটি আরও ভাল সমাধান কারণ এটি সঠিকভাবে তারিখের পার্থক্যটিকে ঘটনার পর থেকে দিনগুলিতে (বা সম্পর্কিত সময় শ্রেণীর ক্ষেত্রে সেকেন্ডে) পরিমাপ করা সময়কাল হিসাবে গণ্য করে। তারপরে একটি বছরের মধ্যে কতগুলি সংখ্যক সাধারণ বিভাগ আপনাকে বয়স দেয়। বছরগুলিতে এইভাবে বয়সের গণনা করার সময়, আপনি যতক্ষণ না মূল ডিওবি মান ধরে রাখছেন ততক্ষণ লিপ বছরের জন্য কোনও ভাতা দেওয়ার দরকার নেই।


জন্মদিন = টাইম.মেকটাইম (1960,5,5) আমাকে পরিসীমা ছাড়িয়েছে (যুগের সমস্যা?)
অ্যান্ড্রু গ্রিম

হ্যাঁ, চলুন যুগের বিষয়গুলি। সমাধান করার জন্য আমি উত্তর আপডেট করেছি।
বব আমান

birthday = DateTime.now - 1.yearদুর্ভাগ্যক্রমে, 365.25 দ্বারা ভাগ করা সামান্য অসম্পূর্ণতা।
সমীর তালোয়ার

আপনি ডেটটাইম অবজেক্ট থেকে ১ বছরের মতো বিয়োগ করতে পারবেন না। 1. বছরের এক বছরে সেকেন্ডের সংখ্যায় সমাধান হয়। ডেটটাইম অবজেক্টগুলি দিনের উপর ভিত্তি করে পরিচালনা করে। উদাহরণস্বরূপ: (ডেটটাইম.নো - ৩5৫.২৫) .স্ট্রফটাইম ("% ডি") যথার্থতার পক্ষে যদি আপনি সত্যিই জন্মদিনের সাথেই কাজ করছেন তবে এটি যথেষ্ট নির্ভুল। বিষয়টির বিষয়টি হ'ল, বয়সের ক্ষেত্রে লোকেরা ইতিমধ্যে যথেষ্ট অসম্পূর্ণ হয়। আমরা সময়ে একটি নির্দিষ্ট মুহুর্তে জন্মগ্রহণ করি, তবে আমরা যখন আমাদের ডিওবি লিখে রাখি তখন আমরা সাধারণত আমাদের জন্মের সঠিক ঘন্টা, মিনিট এবং দ্বিতীয়টি দেই না। এখানে আমার যুক্তি হ'ল আপনি নিজেই এই গণনাটি ম্যানুয়ালি করতে চান না।
বব আমান

1
এটি ১৯০০ সালের আগে জন্মগ্রহণকারী লোকদের পক্ষে কাজ করে না example উদাহরণস্বরূপ, গ্রেট্রুড বাইনস ২০০৯ সালে তার জন্মদিনে ১১৪.৯৯৯৯ বছর বয়সী বলে জানা গেছে।
অ্যান্ড্রু গ্রিম

6

আমার পরামর্শ:

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

কৌশলটি হ'ল সময় সহ বিয়োগ অপারেশন সেকেন্ডে ফিরে আসে


এটা প্রায় সঠিক। লিপ বছর মানে একটি বছর আসলে 365.25 দিন দীর্ঘ long এর অর্থ হ'ল সর্বোত্তমভাবে, এই পদ্ধতিটি আপনার জন্মদিনের 18 ঘন্টা অবধি আপনার বয়স বাড়িয়ে তুলবে না।
রায়ান লু

5

আমার এটা ভাল লেগেছে:

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

আপনি যদি ভাবেন যে এটি 3 টি প্রশ্নের একটি যুক্তিসঙ্গত প্রার্থী যা ইতিমধ্যে 10 টি উত্তর রয়েছে তবে আপনার ব্যক্তিগত পছন্দের চেয়ে আরও বেশি কারণ যুক্ত করা উচিত। অন্যথায়, আপনি বেশি মনোযোগ পাবেন না
জন ডিভোরাক

1
এই বিরতি যখন এক বছর একটি লিপ বছর এবং অন্য না হয়
আর্টেম

শেষ বছরের ফেব যদি 29 দিনের দিন পায় তবে এই গণনা ব্যর্থ হবে
ফিল 88530

5

এই উত্তরটি সেরা, পরিবর্তে এটি upvote।


আমি @ ফিল্ন্যাশের সমাধানটি পছন্দ করি তবে শর্তসাপেক্ষ কমপ্যাক্টর হতে পারে। সেই বুলিয়ান এক্সপ্রেশন যা করায় সেগুলি [মাস, দিন] জোড় লক্সিকোগ্রাফিক ক্রম ব্যবহার করে তুলনা করছে , সুতরাং এর পরিবর্তে কেউ কেবল রুবির স্ট্রিং তুলনা ব্যবহার করতে পারে:

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

1
কি হবে (Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000?
রায়ান লু

বাহ, এতো সুন্দর! আপনার একটি উত্তর দেওয়া উচিত এবং পুরষ্কার সংগ্রহ করা উচিত!
শিল্প

হুম, আসলে আমি এই উত্তরটি ইতিমধ্যে আমার আগে থেকেই
পেয়েছি

ওহ, এখন আমিও করি ... -_- '
রায়ান লু

4

এটি এই উত্তরের রূপান্তর (এটি প্রচুর ভোট পেয়েছে):

# 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

শুধু উপলব্ধি এই একই আনসার হয়
br3nt

1

কারণ পাগল নেভিগেশন রুবি বাঁধা হয়, dotiw মণি অগ্রাহ্য পাগল বিল্ট-ইন distance_of_times_in_words এবং উপলব্ধ distance_of_times_in_words_hash যা বয়স নির্ধারণ করতে ব্যবহার করা যাবে। লিপ বছরগুলি বছরের অংশের জন্য জরিমানা করা হয় যদিও সচেতন থাকুন যে 29 ফেব্রুয়ারির সেই দিনের অংশগুলির উপর প্রভাব রয়েছে যা যদি সেই স্তরের বিশদ প্রয়োজন হয় তবে বোঝার পরোয়ানা রয়েছে। এছাড়াও, আপনি যদি ডটিউ কীভাবে দূরতালিকা_সামান্য_আর_ওয়ার্ডের বিন্যাসটি পরিবর্তন করেন তা পছন্দ না করে, মূল বিন্যাসে ফিরে যেতে: অস্পষ্ট বিকল্পটি ব্যবহার করুন।

জেমফাইলে ডোটিউ যুক্ত করুন:

gem 'dotiw'

কমান্ড লাইনে:

bundle

দূরত্বের_পরিবর্তন_ইন_ওয়ার্ডস এবং দূরত্বের_মোটা_হিন_ওয়ার্ড_হ্যাশ অ্যাক্সেস পেতে উপযুক্ত মডেলটিতে ডেটহেল্পার অন্তর্ভুক্ত করুন। এই উদাহরণে মডেলটি হল 'ব্যবহারকারী' এবং জন্মদিনের ক্ষেত্রটি 'জন্মদিন।

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

1

আমি বিশ্বাস করি এটি কার্যত @ ফিল্ন্যাশের উত্তরের সমতুল্য, তবে আইএমও আরও সহজে বোধগম্য।

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 

0

নিম্নলিখিতটি কাজ করে বলে মনে হচ্ছে (তবে এটি পরীক্ষা করা থাকলে আমি এটির প্রশংসা করব)।

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

0

আপনি যদি দু'একদিনের বিষয়ে চিন্তা না করেন তবে এটি স্বল্প ও সুন্দর স্ব-ব্যাখ্যামূলক হবে।

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

0

ঠিক আছে এই সম্পর্কে:

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

এটি ধরে নেওয়া হচ্ছে আমরা রেল ব্যবহার করছি, ageকোনও মডেলটিতে পদ্ধতিটি কল করছি এবং মডেলটির একটি তারিখের ডাটাবেস কলাম রয়েছে dob। এটি অন্যান্য উত্তরের চেয়ে আলাদা কারণ কারণ আমরা এই বছরের জন্মদিনের আগে আছি কিনা তা নির্ধারণ করতে এই পদ্ধতিটি স্ট্রিংগুলি ব্যবহার করে।

উদাহরণস্বরূপ, যদি dob2004/2/28 হয় এবং today2014/2/28 হয়, ageহবে 2014 - 2004বা 10। ভাসমান হবে 0228এবং 0229b4bdayহবে "0228" < "0229"বা true। অবশেষে, আমরা এর 1থেকে বিয়োগ করব ageএবং পাব 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

👍🏼


শুধু এফআই, আপনার উত্তরটি যৌক্তিকভাবে ফিলানাশের মতো। তার উত্তরটি অনেক পরিস্কার এবং এটি যদিও রেলের উপর নির্ভর করে না।
মান্টাস

@ মনটাস ফিলনাশ বলেছিলেন যে তিনি এই পদ্ধতিটি একটি রেল প্রকল্পে ব্যবহার করেছেন। আপনার ট্যাগগুলিতে রেল ছিল। তার পদ্ধতিতে আমার চেয়ে আরও দুটি তুলনা রয়েছে। তাঁর পদ্ধতির শেষ লাইনটি বোঝা শক্ত।
ক্রুজ নুনেজ

দুঃখিত, তবে ফিলনাশের কোডটি আপনার চেয়ে অনেক বেশি পরিষ্কার। এছাড়াও, তার কোড একটি সহজ পদ্ধতি। আপনার "dob" মান থাকার উপর নির্ভর করে। যা নতুন ব্যবহারকারীদের কাছে এটি পরিষ্কার নয়। এবং এমনকি কোড অনেক সাহায্য করে না। হ্যাঁ, আপনার একেবারে শেষ নমুনা এ থেকে মুক্তি পেয়েছে। তবে ফিল্ন্যাশস কোডের একদম নিখুঁত-এটিকে-সহজ-বোকা keep
মান্টাস

0

আমি মনে করি মাস গণনা না করাই অনেক ভাল, কারণ আপনি ব্যবহার করে বছরের সঠিক দিনটি পেতে পারেন 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


0

ডেটহেল্পারটি কেবল বছরের জন্য ব্যবহার করা যেতে পারে

puts time_ago_in_words '1999-08-22'

প্রায় 20 বছর


0
  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```

-1
  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


-1

লিপ বছরের জন্য অ্যাকাউন্টে (এবং অ্যাক্টিভস সমর্থন উপস্থিতি ধরে):

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) অ্যাকাউন্টে নেওয়ার জন্য তারিখটি সঠিকভাবে সংশোধন করবে ।


-1

এখানে আমার সমাধান যা একটি নির্দিষ্ট তারিখে বয়স গণনা করার অনুমতি দেয়:

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

-2

আমাকেও এটিকে মোকাবেলা করতে হয়েছিল, কিন্তু কয়েক মাস ধরে। খুব জটিল হয়ে ওঠে। সবচেয়ে সহজ উপায় আমি ভাবতে পারি তা হ'ল:

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

এটি মাসের বর্ধিতকরণের জন্য তারিখ শ্রেণি ব্যবহার করবে, যা ২৮ দিন এবং লিপ ইয়ার ইত্যাদি নিয়ে কাজ করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.