Câu trả lời:
Trừ ngày bắt đầu từ ngày kết thúc:
endDate - beginDate
DateTimeđối tượng, hãy chắc chắn chuyển đổi thành Dateđầu tiên, nếu không nó sẽ trả về số giây (tôi đoán).
Dateđối tượng cung cấp cho bạn một thứ Rationalmà bạn có thể cần phải đánh máy thành một số nguyên, như với(endDate - beginDate).to_i
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
Điều này sử dụng một số ngày Julian sửa đổi .
Từ wikipedia :
Ngày Julian (JD) là khoảng thời gian tính bằng ngày và phân số của một ngày kể từ ngày 1 tháng 1 năm 4713 trước Công nguyên Greenwich, lịch proleptic Julian.
Điều này có thể đã thay đổi trong Ruby 2.0
Khi tôi làm điều này, tôi nhận được một phần nhỏ. Ví dụ: trên bàn điều khiển (irb hoặc rails c)
2.0.0-p195 :005 > require 'date'
=> true
2.0.0-p195 :006 > a_date = Date.parse("25/12/2013")
=> #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)>
2.0.0-p195 :007 > b_date = Date.parse("10/12/2013")
=> #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)>
2.0.0-p195 :008 > a_date-b_date
=> (15/1)
Tất nhiên, truyền tới một int cho kết quả mong đợi
2.0.0-p195 :009 > (a_date-b_date).to_i
=> 15
Điều này cũng hoạt động cho các đối tượng DateTime, nhưng bạn phải xem xét vài giây, chẳng hạn như ví dụ này
2.0.0-p195 :017 > a_date_time = DateTime.now
=> #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)>
2.0.0-p195 :018 > b_date_time = DateTime.now-20
=> #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)>
2.0.0-p195 :019 > a_date_time - b_date_time
=> (1727997655759/86400000000)
2.0.0-p195 :020 > (a_date_time - b_date_time).to_i
=> 19
2.0.0-p195 :021 > c_date_time = a_date_time-20
=> #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)>
2.0.0-p195 :022 > a_date_time - c_date_time
=> (20/1)
2.0.0-p195 :023 > (a_date_time - c_date_time).to_i
=> 20
Trong Ruby 2.1.3, mọi thứ đã thay đổi:
> endDate = Date.new(2014, 1, 2)
=> #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)>
> beginDate = Date.new(2014, 1, 1)
=> #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)>
> days = endDate - beginDate
=> (1/1)
> days.class
=> Rational
> days.to_i
=> 1
Còn cái này thì sao?
(beginDate...endDate).count
Range là một bộ nối tiếp độc đáo. Và ...là một phạm vi độc quyền.
Cũng vậy beginDate..(endDate - 1). Ngoại trừ là không.
Trong trường hợp khi BeginDate bằng endDate , phần tử đầu tiên sẽ bị loại vì tính duy nhất và ...sẽ loại trừ phần tử cuối cùng. Vì vậy, nếu chúng ta muốn .counthẹn hò giữa ngày hôm nay và hôm nay, nó sẽ trả về 0.
0, hoạt động hoàn hảo trong một số trường hợp. Ngoài ra, nếu hai ngày giống nhau, nó sẽ trả về 0. Nó cũng trả về một số nguyên đơn giản. Các câu trả lời khác phải được chuyển thành số nguyên hoặc bạn có thể phải dịch thành 0 nếu kết quả là âm.
Thử cái này:
num_days = later_date - earlier_date
tất cả những điều này đã đưa tôi đến kết quả chính xác, nhưng tôi cố gắng làm
DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
YYYY-MM-DDđịnh dạng, đó là những gì mọi người nên sử dụng.
ngày = (endDate - startedDate) / (60 * 60 * 24)