루비 날짜 빼기 (예 : 90 일 전)


89

나는 다음의 joda-time API에 약간 망쳐졌습니다.

DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);

Ruby에서도 비슷한 작업을하려고하는데

now = Time.now
ninetyDaysAgo = now - (90*24)

그러나 수학은 여기서 벗어났습니다 (저는 자정에 데이트 작업을하고 있습니다).

날짜 빼기를위한 친숙한 API가 있습니까?

답변:


105
require 'date'
now = Date.today
ninety_days_ago = (now - 90)

IRB 콘솔을 통해 실행하면 다음과 같은 결과가 나타납니다.

>>require 'date'
now = Date.today
ninety_days_ago = (now - 90)

require 'date'
=> false
now = Date.today
=> #<Date: 2011-03-02 (4911245/2,0,2299161)>
ninety_days_ago = (now - 90)
=> #<Date: 2010-12-02 (4911065/2,0,2299161)>

시간이 필요하면 다음과 같이 말할 수 있습니다. now = DateTime.now


귀하의 원래 게시물, 사전 편집은 내가 필요로하는 것에 가까웠지만 Date.Now는 보호되었습니다. Date.today가 작동했습니다. 첫 번째 광고 문구를 지금 = Date.today로 변경하면 수락하겠습니다.
darthtrevino 2011 년

3
@Matt : 일 대신 90 시간을 빼는 방법은 무엇입니까?
Esteban Feldman 2012

@EstebanFeldman Date은 분수도 허용하므로 할 수 있습니다 Date.today - (90.0/24.0). 결과는 쉽게 변환 할 수 있습니다 to_datetime또는 to_time너무.
jchook

15

Rails를 사용하는 경우 다음을 확인하세요.

DateTime.now - 10.days
=> Sat, 04 May 2013 12:12:07 +0300

20.days.ago - 10.days
=> Sun, 14 Apr 2013 09:12:13 UTC +00:00

10

Rails를 사용 중이거나 ActiveSupport를 포함해도 괜찮다면 다음 과 같이 Numeric # days DSL을 사용할 수 있습니다 .

ruby-1.9.2-p136 :002 > Date.today
 => Wed, 02 Mar 2011 
ruby-1.9.2-p136 :003 > Date.today - 90.days
 => Thu, 02 Dec 2010 

시간 대신 날짜로 작업하기 때문에 Date 인스턴스로 시작하거나 DateTime 인텐스를 #to_date로 변환해야합니다. 날짜 인스턴스에서 숫자를 더하거나 빼면 숫자는 암시 적으로 일입니다.

ruby-1.9.2-p136 :016 > DateTime.now.to_date
 => #<Date: 2011-03-02 (4911245/2,0,2299161)> 
ruby-1.9.2-p136 :017 > DateTime.now.to_date - 90
 => #<Date: 2010-12-02 (4911065/2,0,2299161)> 

8

Ruby는 Ruby 표준 라이브러리의 일부인 Date 및 DateTime 클래스 에서 날짜 산술을 지원합니다 . 두 클래스 모두 날짜 또는 시간에서 일을 더하거나 빼는 # +#- 메서드를 노출 합니다.

$ irb
 > require 'date'
 => true 
 > (DateTime.new(2015,4,1) - 90).to_s  # Apr 1, 2015 - 90 days
 => "2015-01-01T00:00:00+00:00"
 > (DateTime.new(2015,4,1) - 1).to_s   # Apr 1, 2015 - 1 day
 => "2015-03-31T00:00:00+00:00" 

사용 # <<# >> 개월 대신 일에서 작동하는 방법. 월별 산술은 일별 산술과 약간 다릅니다. DateTime 대신 Date를 사용하면 효과가 더 분명해집니다.

 > (Date.new(2015, 5, 31) << 3).to_s  # May 31 - 3 months; 92 days diff
 => "2015-02-28" 

joda-time 예제에 따라 Ruby로 다음과 같이 작성할 수 있습니다.

now =  DateTime.now
ninety_days_ago = now - 90

아니면 그냥

ninety_days_ago = DateTime.now - 90

5

이 슈퍼 이전 게시물이지만, 당신이로 유지하기를 원한다면 Time원래 질문을 받았다처럼, 객체, 오히려 전환보다는 Date객체는 사용을 고려 할 수 있습니다 Ruby Facets.

Ruby Facets는 핵심 Ruby 클래스를위한 표준화 된 확장 라이브러리입니다.

http://rubyworks.github.io/facets/

패싯을 요구하면 Time 객체로 다음을 수행 할 수 있습니다.

Time.now.less(90, :days)


이 프로젝트는 2 년 동안 업데이트되지 않았으며 단일 의견으로 문제를 열었습니다. 죽었어.
user4674453

@ user4674453 마지막 업데이트는 6 개월 전이었습니다. 최신 버전의 Ruby에서 여전히 작동하는 안정적인 라이브러리입니다. "죽은"것으로 간주되지 않기 위해 모든 코드베이스를 매일 업데이트 할 필요는 없습니다.
bigtunacan


-1

간단한 솔루션 :

days90_ago = 90.days.ago.to_date.to_s

OUTPUT:
puts 90_days_ago
=> "2019-10-09" # considering cur_date: 2020-01-07

이것은 ActiveSupport (Rails)를 사용하고 있습니다.
Espen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.