2010-11-14 28 views
13

Sadece Ruby'ye bir göz atıyorum ve tarih/saat ile oynuyordum.Ruby ile randevuları çıkarma

irb(main):001:0> jamis_DOB = Time.mktime(2003, 10, 22, 06, 59) 
=> Wed Oct 22 06:59:00 +0300 2003 
irb(main):002:0> age = Time.now - jamis_DOB 
=> 222934108.172989 
irb(main):005:0> age_in_years = (((age/3600)/24)/365).to_i 
=> 7 

Yani benim örnek o yıllar kadar ekleyin olarak, artık yıllar varsa bilmeyecektir age_in_years olarak o kadar iyi değil. Bazı googled zaman/tarih öğreticiler aracılığıyla oldum ve sadece iki tarih çıkarmak ve bir yıl, ay, gün vb biçiminde dönmek zorunda kolay bir yol bulamadım. Ruby'nin bu tür şeyler için bir eklenti veya yerleşik bir şeyleri olduğunu tahmin ediyorum. Birisi bana ne olduğunu söyleyebilir mi? (Ayrıca, ileride başvurmak için bu tür bir şey için cevapları bulmak için herhangi bir tavsiye?)

Teşekkürler. Sen Date yerine Time istiyorum

cevap

29

:

require 'date' 

now = Date.today 
before = Date.civil(2000, 1, 1) 
difference_in_days = (now - before).to_i 

(difference_in_days/365.25).to_i 

Muhtemelen geliştirilebilir size bugün ve 1 Ocak 2000 yılları arasında farkı verecek, sadece yılda ortalama gün sayısı kullanılır (365.25), size aşırı uç durumlarda doğru cevap verecektir. o 1.8.7 işe yaramaz böylece

require 'date' 

years = 0 
d = Date.civil(2000, 1, 1) 
loop do 
    d = d.next_year 
    break if Date.today < d 
    years += 1 
end 

Ama Date#next_year, Ruby 1.9 ile beraber getirildi:

Ayrıca böyle bir şey yapabilirsiniz. Tabii

, sadece sayıları çıkarılarak iki tarih arasındaki yılların sayısını belirleme kolay yolu:

2010 - 2000 # => 10 
+0

Teşekkür Theo :) Sizin 3 öneri yapmamı ilham ... 'gerektirir tarihi' date_now = Date.today dob = Date.civil (2003, 10, 22) eğer date_now.month> dob.month yaş = date_now.year - dob.year elsif date_now.month == dob .month && date_now.day> dob.day"\ N" I, yaş:yaş = date_now.year - (- - dob.year date_now.year) başka yaş = dob.year 1 ucu uç print "Doğru yaşı" henüz ikinci önerinizi anlayamadı ve 1.9 oynamak için koşamıyor gibi görünmüyor. – Leke

+0

Evet, haklısınız, son örnek, elbette ay ve günü de hesaba katmak zorunda. Ortadaki örnek, döngüdeki her dönüş için bir yıl kadar sürer ve dönüşleri sayar. Biraz daha doğru olması için değiştirdim. – Theo

+2

Ruby'nin tarih çıkarmalarından sonra neden her zaman bir '/ 1' döndürdüğü konusunda kafam karışmıştı, değerin bir kaç gün olarak elde edilmesi için yukarıda belirtildiği gibi bir 'to_i' yapmak önemliydi. – waffl