Saya ingin mendapatkan umur seseorang dari hari ulang tahunnya. now - birthday / 365
tidak bekerja, karena beberapa tahun memiliki 366 hari. Saya datang dengan kode berikut:
now = Date.today
year = now.year - birth_date.year
if (date+year.year) > now
year = year - 1
end
Apakah ada cara yang lebih Ruby untuk menghitung usia?
ruby-on-rails
ruby
Mantra
sumber
sumber
Jawaban:
Saya tahu saya terlambat ke pesta di sini, tetapi jawaban yang diterima akan pecah ketika mencoba mencari tahu usia seseorang yang lahir pada tanggal 29 Februari pada tahun kabisat. Ini karena panggilan untuk
birthday.to_date.change(:year => now.year)
membuat tanggal yang tidak valid.Saya menggunakan kode berikut sebagai gantinya:
sumber
true
||false
?Saya menemukan solusi ini berfungsi dengan baik dan dapat dibaca oleh orang lain:
Mudah dan Anda tidak perlu khawatir tentang menangani tahun kabisat dan semacamnya.
sumber
Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
.Gunakan ini:
sumber
rails/activesupport
.Satu liner di Ruby on Rails (ActiveSupport). Menangani tahun kabisat, detik kabisat dan semua.
Logika dari sini - Hitung usia dalam C #
Dengan asumsi kedua tanggal berada di zona waktu yang sama, jika tidak menelepon
utc()
sebelumnyato_s()
pada keduanya.sumber
(Date.today.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_i
juga bekerjasumber
Jawabannya sejauh ini agak aneh. Upaya awal Anda cukup dekat dengan cara yang benar untuk melakukan ini:
Anda akan mendapatkan hasil fraksional, jadi jangan ragu untuk mengubah hasilnya menjadi bilangan bulat
to_i
. Ini adalah solusi yang lebih baik karena memperlakukan perbedaan tanggal dengan benar sebagai periode waktu yang diukur dalam beberapa hari (atau detik dalam kasus kelas Waktu terkait) sejak peristiwa tersebut. Kemudian pembagian sederhana dengan jumlah hari dalam setahun memberi Anda usia. Saat menghitung usia dalam tahun dengan cara ini, selama Anda mempertahankan nilai DOB asli, tidak perlu ada penyisihan untuk tahun kabisat.sumber
birthday = DateTime.now - 1.year
memberi saya usia 0. Sayangnya, pembagian dengan 365.25 sedikit tidak tepat.Saran saya:
Kuncinya adalah bahwa operasi minus dengan Waktu mengembalikan detik
sumber
Saya suka yang ini:
sumber
Jawaban ini adalah yang terbaik, lebih baik pilih itu.
Saya suka solusi @ philnash, tapi syaratnya bisa compacter. Apa yang dilakukan oleh ekspresi boolean adalah membandingkan pasangan [bulan, hari] menggunakan urutan leksikografis , jadi orang dapat menggunakan perbandingan string Ruby sebagai gantinya:
sumber
(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
?Ini adalah konversi dari jawaban ini (menerima banyak suara):
Ini jelas unik dalam pendekatannya tetapi sangat masuk akal ketika Anda menyadari apa yang dilakukannya:
sumber
Karena Ruby on Rails ditandai, permata permata menimpa Rails bawaan distance_of_times_in_words dan menyediakan distance_of_times_in_words_hash yang dapat digunakan untuk menentukan usia. Tahun kabisat ditangani dengan baik untuk porsi tahun meskipun perlu disadari bahwa 29 Februari memang berpengaruh pada porsi hari yang membutuhkan pemahaman jika tingkat perincian diperlukan. Juga, jika Anda tidak suka bagaimana cara mengubah format distance_of_time_in_words, gunakan opsi: vague untuk kembali ke format asli.
Tambahkan Dotiw ke Gemfile:
Di baris perintah:
Sertakan DateHelper dalam model yang sesuai untuk mendapatkan akses ke distance_of_time_in_words dan distance_of_time_in_words_hash. Dalam contoh ini modelnya adalah 'Pengguna' dan bidang ulang tahun adalah 'ulang tahun.
Tambahkan metode ini ke model yang sama.
Pemakaian:
sumber
Saya percaya ini secara fungsional setara dengan jawaban @ philnash, tetapi IMO lebih mudah dimengerti.
Pemakaian:
sumber
Berikut ini tampaknya berfungsi (tapi saya akan menghargai jika diperiksa).
sumber
Jika Anda tidak peduli satu atau dua hari, ini akan lebih pendek dan cukup jelas.
sumber
Ok bagaimana dengan ini:
Ini dengan asumsi kita menggunakan rel, memanggil
age
metode pada model, dan model memiliki kolom basis data tanggaldob
. Ini berbeda dari jawaban lain karena metode ini menggunakan string untuk menentukan apakah kita sebelum ulang tahun tahun ini.Misalnya, jika
dob
2004/2/28 dantoday
2014/2/28,age
akan2014 - 2004
atau10
. Float akan menjadi0228
dan0229
.b4bday
akan"0228" < "0229"
atautrue
. Akhirnya, kita akan mengurangi1
dariage
dan9
.Ini akan menjadi cara normal untuk membandingkan dua kali.
Ini bekerja sama, tetapi
b4bday
garisnya terlalu panjang. The2016
tahun ini juga tidak perlu. Perbandingan string di awal adalah hasilnya.Anda juga bisa melakukan ini
Jika Anda tidak menggunakan rel, coba ini
👍🏼
sumber
Saya pikir itu jauh lebih baik untuk tidak menghitung bulan, karena Anda bisa mendapatkan hari dalam setahun dengan menggunakan
Time.zone.now.yday
.sumber
Datang dengan variasi Rails dari solusi ini
sumber
DateHelper dapat digunakan untuk mendapatkan tahun saja
sumber
sumber
sumber
sumber
Untuk menghitung tahun kabisat (dan dengan asumsi kehadiran dukungan aktif):
years_since
akan dengan benar mengubah tanggal untuk memperhitungkan tahun non-kabisat (saat ulang tahun02-29
).sumber
Inilah solusi saya yang juga memungkinkan penghitungan usia pada tanggal tertentu:
sumber
Saya harus berurusan dengan ini juga, tetapi selama berbulan-bulan. Menjadi terlalu rumit. Cara paling sederhana yang bisa saya pikirkan adalah:
Anda dapat melakukan hal yang sama dengan 12 bulan:
Ini akan menggunakan kelas Date untuk meningkatkan bulan, yang akan menangani 28 hari dan tahun kabisat dll.
sumber