Til*_*eld 43 ruby datetime subtraction hour
我有一个Ruby DateTime,它从表单中填充.此外,我还有n小时的表格.我想从之前的DateTime中减去这n小时.(获得时间范围).
DateTime有两个方法" - "和"<<"来减去日期和月份,但不是小时.(API).有什么建议我怎么做?
Dan*_*ley 55
你可以做到这一点.
adjusted_datetime = (datetime_from_form.to_time - n.hours).to_datetime
Run Code Online (Sandbox Code Playgroud)
小智 34
你可以减去不到一整天:
two_hours_ago = DateTime.now - (2/24.0)
Run Code Online (Sandbox Code Playgroud)
这适用于分钟和其他任何事情:
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)>
Run Code Online (Sandbox Code Playgroud)
如果浮点算术不准确是一个问题,您可以使用Rational或其他一些安全的算术实用程序.
小智 21
如果你想更加明确这样的行为,那么advance方法很好.
adjusted = time_from_form.advance(:hours => -n)
Run Code Online (Sandbox Code Playgroud)
Nig*_*rne 16
你只需要脱掉一天的时间.
two_hours_ago = DateTime.now - (2.0/24)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但是,您可以使用Rational类:
>> 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
Run Code Online (Sandbox Code Playgroud)
如果您在Rails中工作,则存在以下超级暗示性:
> Time.now - 12.hours
=> 2019-08-19 05:50:43 +0200
Run Code Online (Sandbox Code Playgroud)
(这也适用秒,分钟,天,和年)
如果您仅使用Ruby,DateTime则不能这样做,但是Time可以:
t = Time.now
t = t - (hours*60**2)
Run Code Online (Sandbox Code Playgroud)
请注意,Time它还存储日期信息,这有点奇怪。
如果您必须与 DateTime
DateTime.commercial(date.year,date.month,date.day,date.hour-x,date.minute,date.second)
Run Code Online (Sandbox Code Playgroud)
可能有效,但是很难看。该医生说DateTime是不变的,所以我甚至不能肯定-,并<<
您没有说明您需要如何利用您获得的价值,但是将您的小时数除以 24 以便减去一天的一小部分呢?
mydatetime = DateTime.parse(formvalue)
nhoursbefore = mydatetime - n / 24.0
Run Code Online (Sandbox Code Playgroud)
如果我被允许使用Time而不是DateTime(有多种方法可以将一种转换为另一种):
# Just remove the number of seconds from the Time object
Time.now - (6 * 60 * 60) # 6 hours ago
Run Code Online (Sandbox Code Playgroud)