面试题答案
一键面试require 'active_support/all'
start_time = ActiveSupport::TimeZone.new('Asia/Shanghai').parse('2023-10-01 10:30:00')
end_time = ActiveSupport::TimeZone.new('Asia/Shanghai').parse('2023-10-03 14:45:00')
# 计算时间差
time_diff = end_time - start_time
days = time_diff / 1.day
hours = (time_diff % 1.day) / 1.hour
minutes = ((time_diff % 1.day) % 1.hour) / 1.minute
puts "相差天数: #{days}"
puts "相差小时数: #{hours}"
puts "相差分钟数: #{minutes}"
上述代码中:
- 使用
ActiveSupport::TimeZone
来处理时区问题,这里以Asia/Shanghai
时区为例。通过parse
方法解析时间字符串得到带时区的时间对象。 - 通过
end_time - start_time
得到两个时间的差值(以秒为单位)。 - 分别通过
1.day
、1.hour
、1.minute
这些ActiveSupport
提供的时间单位常量来计算差值中的天数、小时数和分钟数。
如果不使用ActiveSupport
库,也可以使用Ruby标准库中的DateTime
类来处理:
start_time = DateTime.new(2023, 10, 01, 10, 30, 0, '+08:00')
end_time = DateTime.new(2023, 10, 03, 14, 45, 0, '+08:00')
# 计算时间差
time_diff = (end_time - start_time) * 24 * 60
days = (time_diff / 1440).to_i
hours = ((time_diff % 1440) / 60).to_i
minutes = (time_diff % 60).to_i
puts "相差天数: #{days}"
puts "相差小时数: #{hours}"
puts "相差分钟数: #{minutes}"
在这个代码中:
DateTime.new
创建带时区的时间对象,这里时区偏移设为+08:00
。end_time - start_time
得到的是相差的天数,乘以24 * 60
转换为分钟数。- 然后通过取整和取余运算分别得到天数、小时数和分钟数。