从Ruby中的DateTime减去n小时

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)

  • 请记住,这仅适用于Rails上下文.hours()方法来自Rails中的日期助手之一,而不是来自Ruby标准库. (51认同)

小智 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或其他一些安全的算术实用程序.

  • 请注意,由于浮点运算的不准确性,这会导致意外的结果...... (3认同)
  • 在那种情况下,Rational类是一个解决方案^^ (2认同)

小智 21

如果你想更加明确这样的行为,那么advance方法很好.

adjusted = time_from_form.advance(:hours => -n)
Run Code Online (Sandbox Code Playgroud)

  • 对于任何尝试此操作的人:它不在stdlib中,它由ActiveSupport提供.请参见此处:http://stackoverflow.com/questions/617284/where-is-time-advance-documented. (25认同)
  • 谢谢jkp.我对所有这些不适合普通人的例子感到沮丧. (3认同)

Nig*_*rne 16

你只需要脱掉一天的时间.

two_hours_ago = DateTime.now - (2.0/24)
Run Code Online (Sandbox Code Playgroud)
  • 1.0 =一天
  • 1.0/24 = 1小时
  • 1.0 /(24*60)= 1分钟
  • 1.0 /(24*60*60)= 1秒


Mla*_*vić 9

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)

  • 也不是核心Ruby. (6认同)
  • 1)`step`就是为了说明点2)`step`在标准库中:http://rubydoc.info/stdlib/date/1.9.3/Date:step (3认同)

Mat*_*tW. 5

如果您在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是不变的,所以我甚至不能肯定-,并<<


gle*_*ald 5

您没有说明您需要如何利用您获得的价值,但是将您的小时数除以 24 以便减去一天的一小部分呢?

mydatetime = DateTime.parse(formvalue)
nhoursbefore = mydatetime - n / 24.0
Run Code Online (Sandbox Code Playgroud)


fgu*_*len 5

如果我被允许使用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)