pikir maksudmu kurangi tanggal mulai dari tanggal akhir :)
Nader
99
semacam antiklimaks ya?
Brig
18
Catatan: jika Anda menggunakan Wirble di irb (untuk mewarnai output) bilangan rasional akan memiliki 1 disatukan sampai akhir. Astaga! Anda mungkin ingin menggunakan to_i untuk mengonversi hasilnya menjadi integer
jwal
9
Jika Anda memiliki DateTimeobjek, pastikan untuk mengonversi menjadi yang Datepertama, jika tidak, ia mengembalikan jumlah detik (saya kira).
Joshua Muheim
44
juga perhatikan mengurangi dua Dateobjek memberi Anda Rationalbahwa Anda mungkin perlu mengetikkan ke integer, seperti(endDate - beginDate).to_i
MusikAnimal
98
irb(main):005:0> a =Date.parse("12/1/2010")=>#<Date: 4911063/2,0,2299161>
irb(main):007:0> b =Date.parse("12/21/2010")=>#<Date: 4911103/2,0,2299161>
irb(main):016:0> c = b.mjd - a.mjd
=>20
Tanggal Julian (JD) adalah interval waktu dalam beberapa hari dan sebagian kecil dari hari sejak 1 Januari 4713 SM Greenwich siang, kalender proleptik Julian.
Range adalah serangkaian serial unik. Dan ...merupakan Range literal eksklusif.
Begitu beginDate..(endDate - 1)juga. Kecuali tidak.
Dalam hal ketika beginDate sama dengan endDate , elemen pertama akan dikecualikan karena keunikan dan ...akan mengecualikan yang terakhir. Jadi, jika kita ingin .counttanggal antara hari ini dan hari ini, itu akan mengembalikan 0.
Ini adalah jawaban yang sangat bagus, jika tanggal mulai lebih tua dari tanggal akhir, itu akan kembali 0, yang berfungsi dengan baik pada beberapa kasus. Juga, jika dua tanggal adalah sama, itu akan mengembalikan 0. Ini juga mengembalikan bilangan bulat biasa. Jawaban lain harus diubah menjadi bilangan bulat atau Anda mungkin harus menerjemahkan ke 0 jika hasilnya negatif.
Satu berita gembira untuk menunjukkan: DateTime.parse di Ruby mengharapkan tanggal akan diberikan sebagai DD / MM / YYYY, atau DD-MM-YYYY. Sebagai orang Amerika, itu selalu membuat saya marah!
rickumali
15
@rickumali Sebagai anggota dari seluruh dunia, saya berterima kasih kepada Ruby karena menggunakan format tanggal default "kami".
Claudio Holanda
7
@rickumali Ruby juga menerima tanggal dalam YYYY-MM-DDformat, yang memang harus digunakan semua orang.
Tanggal adalah dalam hitungan hari, jadi Anda tidak perlu melakukan ini. Saya pikir solusi Anda menjadi relevan dengan perbedaan DateTime.
suga_shane
1
Nah, jaga apa yang Anda maksud dengan "antara" juga ...
days_apart =(to - from).to_i # from + days_apart = to
total_days =(to - from).to_i +1# number of "selected" days
in_between_days =(to - from).to_i -1# how many days are in between from and to, i.e. excluding those two days
DateTime
objek, pastikan untuk mengonversi menjadi yangDate
pertama, jika tidak, ia mengembalikan jumlah detik (saya kira).Date
objek memberi AndaRational
bahwa Anda mungkin perlu mengetikkan ke integer, seperti(endDate - beginDate).to_i
Ini menggunakan Nomor Hari Julian yang Dimodifikasi .
Dari wikipedia :
sumber
Ini mungkin telah berubah di Ruby 2.0
Ketika saya melakukan ini saya mendapatkan sebagian kecil. Misalnya pada konsol (baik irb atau rails c)
Tentu saja, casting ke int memberikan hasil yang diharapkan
Ini juga berfungsi untuk objek DateTime, tetapi Anda harus mempertimbangkan detik, seperti contoh ini
sumber
Di Ruby 2.1.3 hal telah berubah:
sumber
Bagaimana dengan ini?
Range adalah serangkaian serial unik. Dan
...
merupakan Range literal eksklusif.Begitu
beginDate..(endDate - 1)
juga. Kecuali tidak.Dalam hal ketika beginDate sama dengan endDate , elemen pertama akan dikecualikan karena keunikan dan
...
akan mengecualikan yang terakhir. Jadi, jika kita ingin.count
tanggal antara hari ini dan hari ini, itu akan mengembalikan 0.sumber
0
, yang berfungsi dengan baik pada beberapa kasus. Juga, jika dua tanggal adalah sama, itu akan mengembalikan 0. Ini juga mengembalikan bilangan bulat biasa. Jawaban lain harus diubah menjadi bilangan bulat atau Anda mungkin harus menerjemahkan ke 0 jika hasilnya negatif.Ini bekerja untuk saya:
sumber
Coba ini:
sumber
semua ini mengarahkan saya ke hasil yang benar, tetapi akhirnya saya melakukannya
sumber
YYYY-MM-DD
format, yang memang harus digunakan semua orang.days = (endDate - beginDate) / (60 * 60 * 24)
sumber
Nah, jaga apa yang Anda maksud dengan "antara" juga ...
sumber