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"

Jawaban:


207

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


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

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"

@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

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

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.


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

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

-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

3
lebih mudah untuk mengurangi objek tanggal.
OpenCoderX

OP tidak pernah bertanya tentang penyesuaian untuk hari kerja. Ini benar-benar berbelit-belit.
Nathan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.