문제

양식으로 채워진 루비 DateTime이 있습니다. 또한 양식에서도 N 시간이 있습니다. 이전 DateTime에서 그 n 시간을 빼고 싶습니다. (시간 범위를 얻기 위해).

DateTime에는 두 가지 방법 "-"와 "<<"가 시간과 월을 빼지 만 시간이 없습니다. (API). 내가 어떻게 할 수 있는지에 대한 제안이 있습니까?

도움이 되었습니까?

해결책

당신은 이것을 할 수 있습니다.

adjusted_datetime = (datetime_from_form.to_time - n.hours).to_datetime

다른 팁

하루 종일 뺄 수 있습니다.

two_hours_ago = DateTime.now - (2/24.0)

이것은 몇 분 동안 작동합니다.

hours = 10
minutes = 5
seconds = 64

hours = DateTime.now - (hours/24.0) #<DateTime: 2015-03-11T07:27:17+02:00 ((2457093j,19637s,608393383n),+7200s,2299161j)>
minutes = DateTime.now - (minutes/1440.0) #<DateTime: 2015-03-11T17:22:17+02:00 ((2457093j,55337s,614303598n),+7200s,2299161j)>
seconds = DateTime.now - (seconds/86400.0) #<DateTime: 2015-03-11T17:26:14+02:00 ((2457093j,55574s,785701811n),+7200s,2299161j)>

플로팅 포인트 산술 부정확이 문제가되는 경우 사용할 수 있습니다. Rational 또는 다른 안전한 산술 유틸리티.

이와 같은 행동에 대해 더 명확하게 원한다면 사전 방법이 좋습니다.

adjusted = time_from_form.advance(:hours => -n)

하루의 일부를 벗어야합니다.

two_hours_ago = DateTime.now - (2.0/24)
  • 1.0 = 하루
  • 1.0/24 = 1 시간
  • 1.0/(24*60) = 1 분
  • 1.0/(24*60*60) = 1 초

n/24.0 플로트가 결국 둥글면 트릭이 제대로 작동하지 않습니다.

>> DateTime.parse('2009-06-04 02:00:00').step(DateTime.parse('2009-06-04 05:00:00'),1.0/24){|d| puts d}
2009-06-04T02:00:00+00:00
2009-06-04T03:00:00+00:00
2009-06-04T03:59:59+00:00
2009-06-04T04:59:59+00:00

그러나 대신 합리적 클래스를 사용할 수 있습니다.

>> DateTime.parse('2009-06-04 02:00:00').step(DateTime.parse('2009-06-04 05:00:00'),Rational(1,24)){|d| puts d}
2009-06-04T02:00:00+00:00
2009-06-04T03:00:00+00:00
2009-06-04T04:00:00+00:00
2009-06-04T05:00:00+00:00

당신은 당신이 얻는 가치에 대해 어떤 용도를 만들어야하는지 말하지 않았지만, 시간을 24로 나누어 하루의 일부를 빼는 것은 어떻습니까?

mydatetime = DateTime.parse(formvalue)
nhoursbefore = mydatetime - n / 24.0

편집하다: 보세요 이 질문 접근 방식을 사용하기로 결정하기 전에 여기에 설명했습니다. 루비에서 기본 클래스의 동작을 수정하는 것이 모범 사례가 아닐 수도 있습니다 (이해할 수 있습니다). 그러니 소금 한 덩어리 로이 답을 가져 가십시오 ...


Mattw의 대답 내가 가장 먼저 생각한 것이었지만 나는 또한 그것을 크게 좋아하지 않았습니다.

패치를 통해 덜 못 생겼다고 생각합니다. DateTime 그리고 Fixnum 원하는대로 :

require 'date'

# A placeholder class for holding a set number of hours.
# Used so we can know when to change the behavior
# of DateTime#-() by recognizing when hours are explicitly passed in.

class Hours
   attr_reader :value

   def initialize(value)
      @value = value
   end
end

# Patch the #-() method to handle subtracting hours
# in addition to what it normally does

class DateTime

   alias old_subtract -

   def -(x) 
      case x
        when Hours; return DateTime.new(year, month, day, hour-x.value, min, sec)
        else;       return self.old_subtract(x)
      end
   end

end

# Add an #hours attribute to Fixnum that returns an Hours object. 
# This is for syntactic sugar, allowing you to write "someDate - 4.hours" for example

class Fixnum
   def hours
      Hours.new(self)
   end
end

그런 다음 다음과 같이 코드를 쓸 수 있습니다.

some_date = some_date - n.hours

어디 n 잠자리에서 나누고 싶은 시간 수입니다. some_date

DateTime 이것을 할 수는 없지만 Time 할 수 있다:

t = Time.now
t = t-hours*60

주목하십시오 Time 또한 날짜 정보를 저장하면 조금 이상합니다.

함께 일해야한다면 DateTime

DateTime.commercial(date.year,date.month,date.day,date.hour-x,date.minute,date.second)

효과가 있지만 추악합니다. 의사가 말합니다 DateTime 불변이기 때문에 확실하지 않습니다 - 그리고 <<

내가 사용할 수 있다면 Time 대신에 DateTime (있습니다 서로 번역하는 몇 가지 방법):

# Just remove the number of seconds from the Time object
Time.now - (6 * 60 * 60) # 6 hours ago

나는 Active_Support에서 도우미를 사용하는 것을 좋아합니다. 정말 깨끗하고 읽기 쉽습니다.

아래 예를 참조하십시오.

require 'active_support'

last_accessed = 2.hours.ago
last_accessed = 2.weeks.ago
last_accessed = 1.days.ago

현재 날짜가 사용되는 경우 이러한 종류의 구문을 사용하여 원하는대로 수행하는 방법이있을 수 있습니다.

당신은 이것을 사용할 수 있습니다 :

Time.now.ago(n*60*60)

예를 들어 Time.now.ago(7200) 지금부터 2 시간 전에 날짜와 시간을 줄 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top