【发布时间】:2010-10-18 16:28:18
【问题描述】:
我正在尝试获取两个不同 Time 实例的小时数差异。我从数据库中获取这些值作为 :datetime 列
我怎样才能做到这一点,以便它在计算中包括月份和年份,同时忽略或四舍五入分钟?这只能手动完成还是有一个功能可以做到这一点?
【问题讨论】:
我正在尝试获取两个不同 Time 实例的小时数差异。我从数据库中获取这些值作为 :datetime 列
我怎样才能做到这一点,以便它在计算中包括月份和年份,同时忽略或四舍五入分钟?这只能手动完成还是有一个功能可以做到这一点?
【问题讨论】:
((date_2 - date_1) / 3600).round
或
((date_2 - date_1) / 1.hour).round
【讨论】:
(date_2 - date_1) * 24 来获取时间
Time 或 ActiveSupport::TimeWithZone 的实例(您通常从 datetime 数据库列中获得) )。另一方面,对于 Date 或 Datetime 的实例,您需要乘以 24 才能达到相同的效果,因为内部单位是天,而不是秒。
您可以使用名为 time_diff 的 gem 以非常有用的格式获取时差
【讨论】:
这很好用,例如用户创建帐户后的小时数
(Time.parse(DateTime.now.to_s) - Time.parse(current_user.created_at.to_s))/3600
【讨论】:
在https://rubygems.org/gems/time_difference尝试 Ruby 的 Time Difference gem
start_time = Time.new(2013,1)
end_time = Time.new(2014,1)
TimeDifference.between(start_time, end_time).in_years
【讨论】:
44.hours - 2.hours # => 42.hours?
你可以使用 Rails 的方法distance_of_time_in_words
distance_of_time_in_words(starting_time, ending_time, options = {include_seconds: true })
【讨论】:
distance_of_time_in_words_to_now(DateTime.now - 36.hours) 将返回1 day
在 Rails 中,现在有一种更自然的方式来实现这一点:
> past = Time.now.beginning_of_year
2018-01-01 00:00:00 +0100
> (Time.now - past) / 1.day
219.50031326506948
【讨论】:
Rails 6.1 引入了新的ActiveSupport::Duration 转换方法,例如in_seconds、in_minutes、in_hours、in_days、in_weeks、in_months 和in_years。
因此,现在,您的问题可以这样解决:
date_1 = Time.parse('2020-10-19 00:00:00 UTC')
date_2 = Time.parse('2020-10-19 03:35:38 UTC')
(date_2 - date_1).seconds.in_hours.to_i
# => 3
【讨论】: