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ứ Rational
mà 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 .count
hẹ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)