Ruby에서 두 Date 객체 사이의 일 수를 어떻게 찾을 수 있습니까?


141

두 Date 객체 사이의 일 수를 어떻게 알 수 있습니까?

답변:


170

종료 날짜에서 시작 날짜를 뺍니다.

endDate - beginDate 

2
종료 날짜에서 시작 날짜를 빼는 것을 의미한다고 생각합니다. :)
Nader

99
어떤 종류의 진드기?
Brig

18
참고 : irb에서 Wirble을 사용하는 경우 (출력을 채색하기 위해) 합리적인 숫자는 끝에 1을 연결합니다. 이케 to_i를 사용하여 결과를 정수로 변환 할 수 있습니다.
jwal

9
DateTime객체 가있는 경우 Date먼저 변환해야하며 , 그렇지 않으면 초 수를 반환합니다.
Joshua Muheim

44
또한 두 Date객체를 빼면 다음 Rational과 같이 정수로 타입 캐스트해야 할 수도 있습니다.(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

수정 된 율리우스 일 수를 사용합니다 .

에서 위키 피 디아 :

율리우스 력 날짜 (JD)는 BC 주 그리니치 표준시 인 4713 년 1 월 1 일부터 줄리안 다산 달력으로 일과 시간의 간격을 나타냅니다.


53

루비 2.0에서 변경되었을 수 있습니다

내가 이것을 할 때 나는 분수를 얻는다. 예를 들어 콘솔 (irb 또는 레일 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) 

물론 int로 캐스팅하면 예상 결과를 얻을 수 있습니다.

2.0.0-p195 :009 > (a_date-b_date).to_i
 => 15 

이것은 DateTime 객체에서도 작동하지만이 예제와 같이 초를 고려해야합니다.

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

Ruby 2.1.3에서 상황이 변경되었습니다.

> 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

이건 어때요?

(beginDate...endDate).count

범위는 고유 한 일련의 집합입니다. 그리고 ...독점적 인 Range 리터럴입니다.

그래서 beginDate..(endDate - 1)동일합니다. 그렇지 않다.

beginDate가 endDate 와 같은 경우 고유성으로 인해 첫 번째 요소 ...가 제외되고 마지막 요소는 제외됩니다 . .count오늘과 오늘 사이의 날짜를 원하면 0을 반환합니다.


beginDate가 endDate보다 오래된 경우 매우 좋은 답변입니다.이 경우 반환됩니다 0. 일부 경우에는 완벽하게 작동합니다. 또한 두 날짜가 같으면 0을 반환하고 일반 정수도 반환합니다. 다른 답변은 정수로 변환해야하거나 결과가 음수이면 0으로 변환해야 할 수 있습니다.
EmmanuelB

8

이것은 나를 위해 일했다 :

(endDate - beginDate).to_i


6

이 모든 것이 나를 올바른 결과로 이끌었지만, 나는 상처를 입었습니다.

DateTime.now.mjd - DateTime.parse("01-01-1995").mjd

루디의 DateTime.parse는 날짜가 DD / MM / YYYY 또는 DD-MM-YYYY로 제공 될 것으로 예상합니다. 미국인으로서 항상 날 버린다!
rickumali

15
@rickumali 다른 국가의 회원으로서 "우리의"기본 날짜 형식을 사용해 주신 Ruby에게 감사합니다.
Claudio Holanda

7
@rickumali Ruby는 날짜를 YYYY-MM-DD형식으로 허용하므로 모든 사람들이 사용해야합니다.
user513951

1

일 = (endDate-beginDate) / (60 * 60 * 24)


5
날짜는 일 단위이므로이 작업을 수행 할 필요가 없습니다. 귀하의 솔루션이 DateTime의 차이점과 관련이 있다고 생각합니다.
suga_shane

1

음, "사이에"라는 말의 의미를 잘 관리하십시오.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.