Hitung jumlah hari antara dua tanggal

149

Bagaimana saya menghitung jumlah hari antara dua tanggal ini?

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"
andkjaer
sumber

Jawaban:

207

Dengan kelas Date (dan DateTime) yang dapat Anda lakukan (end_date - start_date).to_iuntuk mendapatkan perbedaan jumlah hari.

Andrew France
sumber
5
@MichaelDurrant Anda membuat asumsi yang tidak beralasan. Pengguna tidak menentukan apakah mereka adalah string atau tidak. Bahkan karena mereka menggunakan Rails, kemungkinan besar tanggal berasal dari ActiveRecord yang secara otomatis akan melemparkannya ke objek tanggal. Teks yang diberikan juga identik dengan representasi objek Date, sehingga sangat mungkin berasal dari sumber asli.
Andrew France
84
Itu memberi saya perbedaan dalam hitungan detik TIDAK dalam beberapa hari dengan rel v3 / 4
2called-chaos
6
Sejauh yang saya tahu perilaku tetap sama di semua versi terbaru dari Ruby dan ActiveSupport, termasuk 2.0 dan 4.1.0 masing-masing. Timeobjek memang kembali beberapa detik.
Andrew France
5
untuk memperluas pada @ 2called-chaos answer, untuk mendapatkan hari yang Anda perlukan (end_date - start_date) /1.day, yang akan memberi Anda float. Jika Anda ingin memiliki hari penuh hanya Anda yang dapat menggunakan ((end_date - start_date) /1.day) .ceil
David K.
2
@ David Kecuali bahwa komentar oleh @ 2called-chaos keliru merujuk ke Timeobjek, bukan Dateobjek. Mungkin Anda dapat memperbarui penamaan dalam komentar Anda untuk mencerminkan bahwa mereka bukan tanggal?
Andrew France
109

Dengan asumsi itu end_datedan start_datekeduanya adalah kelas ActiveSupport::TimeWithZonedi Rails, maka Anda dapat menggunakan:

(end_date.to_date - start_date.to_date).to_i
lee
sumber
2
Jika ada hubungannya dengan bidang tabel, jawaban ini adalah cara untuk pergi; bukannya yang paling dinilai di sini.
Ben
Tidak berhasil (Time.zone.now.to_date - 23.hours.ago.to_date).to_i, ia memberi 1 dan seharusnya 0
Yuri Ghensev
3
@YuriGhensev, itu tergantung pada kapan Anda menjalankan kode contoh Anda, misalnya sekarang Time.zone.now.to_datemengembalikan "Rab, 15 Nov 2017", sementara 23.hours.ago.to_datemengembalikan "Sel, 14 Nov 2017". Perbedaan dalam jumlah hari adalah dan harus 1 kecuali Anda menjalankan kode Anda pada jam sebelum tengah malam.
lee
35

Rails memiliki beberapa bantuan bawaan yang mungkin bisa menyelesaikan ini untuk Anda. Satu hal yang perlu diingat adalah bahwa ini adalah bagian dari Actionview Helper, sehingga mereka tidak akan tersedia langsung dari konsol.

Coba ini

<% start_time =  "2012-03-02 14:46:21 +0100" %>
<% end_time   =  "2012-04-02 14:46:21 +0200" %>
<%= distance_of_time_in_words(start_time, end_time)  %>

 "about 1 month"
Justin Herrick
sumber
@MaayanNaveh seharusnya tidak ketika Anda membutuhkan angka aktual untuk perhitungan.
Fedcomp
Pertanyaan ini adalah salah satu kasus di mana pertanyaan itu sendiri lebih baik ditanyakan secara berbeda. Jika Anda mengikuti jawaban lain di sini, Anda akan mengalami kasus di mana kadang-kadang Anda ingin minggu atau tahun ditampilkan, bukan hari. Ini benar-benar harus diterima sebagai jawaban Rails "benar".
Dylan Pierce
34

Saya terus mendapatkan hasil dalam hitungan detik, jadi ini berhasil bagi saya:

(Time.now - self.created_at) / 86400
Senjata itu
sumber
1
@Epigene 1.daytidak rubyseperti yang diminta OP (dalam tag). Ini Railsatau lebih spesifik active supportmeskipun created_atpada dasarnya adalah Modelmetode untuk Railsitu ..
Roko
26

untuk mendapatkan jumlah hari dalam rentang waktu (hanya hitungan semua hari)

(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32

untuk mendapatkan jumlah hari antara 2 tanggal

(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
a14m
sumber
Terima kasih untuk ini @ a14m! Memberi saya cara untuk melakukan penangkapan tanggal yang inklusif dan eksklusif :)
Kris Boyd
18

Tidak satu pun dari jawaban sebelumnya (hingga tanggal ini) yang memberikan perbedaan yang benar dalam hari antara dua tanggal.

Salah satu yang paling dekat adalah dengan obligasi itu . Jawaban lengkap akan dikonversi to_idan kemudian bagi:

(Time.now.to_i - 23.hours.ago.to_i) / 86400
>> 0

(Time.now.to_i - 25.hours.ago.to_i) / 86400
>> 1

(Time.now.to_i - 1.day.ago.to_i) / 86400
>> 1

Dalam contoh spesifik pertanyaan, seseorang tidak boleh menguraikan Datejika waktu berlalu relevan. Gunakan Time.parsesebagai gantinya.

Yuri Ghensev
sumber
Ini mungkin tidak berfungsi seperti yang diharapkan ketika waktu melewati transisi DST bergerak maju. Dalam hal ini, panjang hari transisi DST secara sah kurang dari 24 jam, tetapi karena aritmatika bilangan bulat hari itu tidak akan tercermin sama sekali.
PinnyM
4

Untuk memiliki jumlah hari penuh antara dua tanggal ( DateTimeobjek):

((end_at - start_at).to_f / 1.day).floor
Dorian
sumber
Masalah DST yang sama dengan jawaban yang Yuri berikan. Aritmatika dengan waktu tidak pernah
semudah yang
0

Untuk mendapatkan perbedaan jumlah hari berdasarkan dua tanggal:

(start.to_date...end.to_date).count - 1
or 
(end.to_date - start.to_date).to_i
giapnh
sumber
-8
def business_days_between(date1, date2)
  business_days = 0
  date = date2
  while date > date1
   business_days = business_days + 1 unless date.saturday? or date.sunday?
   date = date - 1.day
  end
  business_days
end
Teja
sumber
3
lebih mudah untuk mengurangi objek tanggal.
OpenCoderX
OP tidak pernah bertanya tentang penyesuaian untuk hari kerja. Ini benar-benar berbelit-belit.
Nathan