Làm cách nào tôi có thể tìm thấy số ngày giữa hai đối tượng Date trong Ruby?


141

Làm cách nào tôi có thể tìm thấy số ngày giữa hai đối tượng Ngày?

Câu trả lời:


170

Trừ ngày bắt đầu từ ngày kết thúc:

endDate - beginDate 

2
nghĩ rằng bạn có nghĩa là trừ ngày bắt đầu từ ngày kết thúc :)
Nader

99
loại chống đạo đức hả?
Brig

18
lưu ý: nếu bạn đang sử dụng Wirble trong irb (để tô màu đầu ra), số hữu tỷ sẽ có 1 kết nối đến cuối. yike! bạn có thể muốn sử dụng to_i để chuyển đổi kết quả thành số nguyên
jwal

9
Nếu bạn có một 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).
Joshua Muheim

44
cũng lưu ý trừ hai 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
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

Đ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.


53

Đ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 

29

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 

21

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.


Đây là một câu trả lời rất hay, nếu BeginDate cũ hơn endDate, nó sẽ trở lại 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.
EmmanuelB

8

Điều này làm việc cho tôi:

(endDate - beginDate).to_i


6

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

Một thông tin cần chỉ ra: DateTime.parse trong Ruby hy vọng ngày sẽ được đưa ra là DD / MM / YYYY hoặc DD-MM-YYYY. Là một người Mỹ, nó luôn ném tôi đi!
rickumali

15
@rickumali Là một thành viên từ phần còn lại của thế giới, tôi cảm ơn Ruby vì đã sử dụng định dạng ngày mặc định "của chúng tôi".
Claudio Holanda

7
@rickumali Ruby cũng chấp nhận ngày ở YYYY-MM-DDđịnh dạng, đó là những gì mọi người nên sử dụng.
dùng513951

1

ngày = (endDate - startedDate) / (60 * 60 * 24)


5
Ngày tính theo ngày, vì vậy bạn không cần phải làm điều này. Tôi nghĩ rằng giải pháp của bạn trở nên phù hợp với sự khác biệt của DateTime.
suga_shane

1

Chà, quan tâm đến ý của bạn là "giữa" quá ...

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.