두 날짜 사이의 일 수를 센다


149

이 두 날짜 사이의 일수를 어떻게 계산합니까?

start_date = Date.parse "2012-03-02 14:46:21 +0100"
end_date =  Date.parse "2012-04-02 14:46:21 +0200"

답변:


207

Date (및 DateTime) 클래스를 사용하면 (end_date - start_date).to_i일 수 차이를 얻을 수 있습니다 .


5
@MichaelDurrant 당신은 부주의 한 가정을하고 있습니다. 사용자는 문자열인지 여부를 지정하지 않습니다. 실제로 Rails를 사용하고 있기 때문에 날짜가 ActiveRecord에서 제공되어 날짜 데이터로 자동 전송됩니다. 주어진 텍스트는 Date 객체 표현과 동일하므로 기본 소스에서 온 것 같습니다.
앤드류 프랑스

84
즉 NOT V3 / 4 레일 일에 나에게 초 차이를 제공합니다
2called-혼란

6
내가 말할 수있는 한, 모든 최신 버전의 Ruby 및 ActiveSupport에서 동작은 동일하게 유지되며 각각 2.0과 4.1.0을 포함합니다. Time객체는 초를 반환합니다.
Andrew France

5
@ 2called-chaos 답변을 확장하고 (end_date-start_date) /1.day가 필요한 날을 얻으려면 float를 제공합니다. 하루 종일 보내고 싶다면 ((end_date-start_date) /1.day) .ceil
David K.

2
@David @ 2called-chaos의 주석이 실수가 Time아닌 Date객체를 가리키는 것 입니다. 아마도 날짜가 아닌 것을 반영하여 주석의 이름을 업데이트 할 수 있습니까?
앤드류 프랑스

109

그 가정 end_datestart_date클래스의 모두 ActiveSupport::TimeWithZone레일에, 당신은 사용할 수 있습니다 :

(end_date.to_date - start_date.to_date).to_i

2
그것이 테이블 필드와 관련이 있다면,이 대답은 갈 길입니다. 바로 여기에서 가장 등급이 높은 것 대신에.
Ben

작동하지 않음 (Time.zone.now.to_date - 23.hours.ago.to_date).to_i, 1을 제공하고 0이어야 함
Yuri Ghensev

3
@YuriGhensev, 예제 코드를 실행하는 시점에 따라 달라집니다. 예를 들어 지금 Time.zone.now.to_date은 "Wed, 15 Nov 2017"을 23.hours.ago.to_date반환하고 "Tue, 14 Nov 2017" 을 반환합니다. 자정 전 한 시간에 코드를 실행하지 않는 한 일 수의 차이는 1이어야합니다.
lee

35

Rails에는 이를 해결할 수 있는 내장 된 도우미 가 있습니다. 명심해야 할 것은 이것이 Actionview 헬퍼의 일부이므로 콘솔에서 직접 사용할 수 없다는 것입니다.

이 시도

<% start_time =  "2012-03-02 14:46:21 +0100" %>
<% end_time   =  "2012-04-02 14:46:21 +0200" %>
<%= distance_of_time_in_words(start_time, end_time)  %>

 "about 1 month"

@MaayanNaveh 계산을 위해 실제 숫자가 필요할 때는 안됩니다.
Fedcomp

이 질문은 질문 자체가 다르게 다르게 요청되는 경우 중 하나입니다. 여기에 다른 답변을 따르면 때로는 며칠 대신 몇 주 또는 몇 년을 원하는 경우가 발생할 수 있습니다. 이것은 "올바른"Rails 답변으로 받아 들여 져야합니다.
Dylan Pierce

34

몇 초 만에 결과를 얻었으므로 이것이 효과가있었습니다.

(Time.now - self.created_at) / 86400

1
@Epigene 1.dayrubyOP 요청 (태그) 이 아닙니다 . 그것은 Rails좀 더 구체적 active support이지만 created_at기본적으로 Model방법입니다 Rails..
Roko

26

시간 범위에서 일 수를 얻으려면 (모든 일 수)

(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32

두 날짜 사이의 일 수를 얻으려면

(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31

이 @ a14m 주셔서 감사합니다! 나에게 포괄적이고 독점적 인 날짜 캡처를 할 수있는 방법 : 준
크리스 보이드를

18

이 날짜까지의 이전 답변 중 어느 것도 두 날짜 사이의 정확한 차이를 제공하지 않습니다.

가장 가까운 것은 thatdankent 입니다. 완전한 대답은 to_i다음과 같이 변환 하고 나눕니다.

(Time.now.to_i - 23.hours.ago.to_i) / 86400
>> 0

(Time.now.to_i - 25.hours.ago.to_i) / 86400
>> 1

(Time.now.to_i - 1.day.ago.to_i) / 86400
>> 1

질문의 특정 예에서, Date통과 된 시간이 관련이 있는지 구문 분석해서는 안됩니다 . Time.parse대신 사용하십시오 .


시간이 앞으로 이동하는 DST 전환을 통과하면 예상대로 작동하지 않을 수 있습니다. 이 경우 DST 전환 일 길이는 합법적으로 24 시간 미만이지만 정수 산술로 인해 해당 날짜는 전혀 반영되지 않습니다.
PinnyM

4

두 날짜 ( DateTime오브젝트) 사이의 하루 수를 유지하려면 다음을 수행하십시오 .

((end_at - start_at).to_f / 1.day).floor

유리가 준 답과 같은 DST 문제. 시간과 함께 산술은 당신이 기대하는 것만 큼 간단하지 않습니다 :)
PinnyM

0

두 날짜로 일 수 차이를 얻으려면 다음을 수행하십시오.

(start.to_date...end.to_date).count - 1
or 
(end.to_date - start.to_date).to_i

-8
def business_days_between(date1, date2)
  business_days = 0
  date = date2
  while date > date1
   business_days = business_days + 1 unless date.saturday? or date.sunday?
   date = date - 1.day
  end
  business_days
end

3
날짜 객체를 빼기가 훨씬 쉽습니다.
OpenCoderX

OP는 영업일 조정에 대해 묻지 않았습니다. 어쨌든 이것은 정말 복잡합니다.
Nathan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.