두 날짜 사이의 일 수를 센다


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_date및 start_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.day은 rubyOP 요청 (태그) 이 아닙니다 . 그것은 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.