Saya memiliki dua objek DateTime Ruby on Rails. Bagaimana menemukan jumlah bulan di antara mereka? (Ingatlah bahwa mereka mungkin berasal dari tahun yang berbeda)
Saya memiliki dua objek DateTime Ruby on Rails. Bagaimana menemukan jumlah bulan di antara mereka? (Ingatlah bahwa mereka mungkin berasal dari tahun yang berbeda)
Jawaban:
(date2.year * 12 + date2.month) - (date1.year * 12 + date1.month)
info lebih lanjut di http://www.ruby-forum.com/topic/72120
(12 * (date2.year - date1.year) + date2.month - date1.month).abs if date1 && date2
Jawaban yang lebih akurat akan mempertimbangkan hari-hari di kejauhan.
Misalnya, jika Anda menganggap bahwa bulan-jarak dari 28/4/2000
dan 1/5/2000
adalah 0
bukan 1
, maka Anda dapat menggunakan:
(date2.year - date1.year) * 12 + date2.month - date1.month - (date2.day >= date1.day ? 0 : 1)
Cobalah
((date2.to_time - date1.to_time)/1.month.second).to_i
irb>Time.at("2014-10-01".to_time - "2014-12-01".to_time).month => 10
(Saya menyerah pada pemformatan ... tidak bisa mengetahuinya)
Date.new(2014, 10, 31), Date.new(1997, 4, 30)
saya menerima 213, bukan 210 bulan. Alasannya 1.month.seconds
adalah karena jumlah detik dalam 30 hari dan bukan rata-rata detik dalam sebulan. Merendahkan suara sehingga orang lain tetap bebas bug.
Anda dapat mengubah pertanyaan menjadi "berapa hari pertama ada di antara permulaan bulan dari tanggal", dan kemudian gunakan transformasi data gaya fungsional:
(date1.beginning_of_month...date2.beginning_of_month).select { |date| date.day == 1 }.size
Dengan asumsi keduanya adalah tanggal:
((date2 - date1).to_f / 365 * 12).round
sederhana.
((date2 - date1).to_f / 60 / 60 / 24 / 365 * 12).round
start_date = Date.today
end_date = Date.today+90
months = (end_date.month+end_date.year*12) - (start_date.month+start_date.year*12)
//months = 3
Solusi lain yang saya temukan (membangun solusi yang sudah diposting di sini) adalah jika Anda ingin hasilnya menyertakan pecahan bulan. Misalnya jaraknya 1.2 months
.
((date2.to_time - date1.to_time)/1.month.second).round(1) #Tenth of a month Ex: 1.2
((date2.to_time - date1.to_time)/1.month.second).round(2) #Hundreth, ex: 1.23 months
etc...
def difference_in_months(date1, date2)
month_count = (date2.year == date1.year) ? (date2.month - date1.month) : (12 - date1.month + date2.month)
month_count = (date2.year == date1.year) ? (month_count + 1) : (((date2.year - date1.year - 1 ) * 12) + (month_count + 1))
month_count
end
Saya membutuhkan jumlah bulan yang tepat (termasuk desimal) antara dua tanggal dan menulis metode berikut untuk itu.
def months_difference(period_start, period_end)
period_end = period_end + 1.day
months = (period_end.year - period_start.year) * 12 + period_end.month - period_start.month - (period_end.day >= period_start.day ? 0 : 1)
remains = period_end - (period_start + months.month)
(months + remains/period_end.end_of_month.day).to_f.round(2)
end
Jika membandingkan katakanlah 26 September hingga 26 September (hari yang sama) saya menghitungnya sebagai 1 hari. Jika Anda tidak membutuhkannya, Anda dapat menghapus baris pertama dalam metode ini:period_end = period_end + 1.day
Ini melewati spesifikasi berikut:
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 31))).to eq 1.0
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 30))).to eq 0.97
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 10, 31))).to eq 3.0
# Overlapping february (28 days) still counts Feb as a full month
expect(months_difference(Date.new(2017, 1, 1), Date.new(2017, 3, 31))).to eq 3.0
expect(months_difference(Date.new(2017, 2, 10), Date.new(2017, 3, 9))).to eq 1.0
# Leap year
expect(months_difference(Date.new(2016, 2, 1), Date.new(2016, 2, 29))).to eq 1.0
Ini metode lain. Ini akan membantu menghitung jumlah bulan penuh antara dua tanggal
def months_difference(date_time_start, date_time_end)
curr_months = 0
while (date_time_start + curr_months.months) < date_time_end
curr_months += 1
end
curr_months -= 1 if (date_time_start + curr_months.months) > date_time_end
curr_months.negative? ? 0 : curr_months
end
Solusi untuk semua kasus
(date1..date2).map { |date| date.strftime('%m.%Y') }.uniq.size