在Ruby中将军事(24小时制)转换为HH:MM格式的最简单方法是什么?
我有两个24小时的时间值存储在一个记录中,我想在视图中显示它们,如“2:00 - 4:00”,当以两个整数值(例如1400和1600)开始时。
我的hack-y解决方案是创建辅助函数:
def format_time(time)
if (time-1200 < 1000)
if (time-1200 < 100)
return time.to_s.insert(2, ":")
else
return (time-1200).to_s.insert(1, ":")
end
else
return (time-1200).to_s.insert(2, ":")
end
end
我甚至不确定它是否一直有效。我假设有更好的方法来做到这一点。
更新:我还需要这个来处理不以'00'结尾的值。 IE 1430或830。
答案 0 :(得分:7)
您可以使用Time.strptime
解析字符串以获取时间对象。这可以用Time.strftime
打印:
require 'time'
%w{1400 1600}.each{|t|
p Time.strptime(t, '%H%M').strftime('%l:%M')
}
优点:输入和输出格式的变化非常简单。
替代:
require 'date' #load DateTime.strptime
%w{1400 1600}.each{|t|
p DateTime.strptime(t, '%H%M').strftime('%l:%M')
}
我希望DateTime的解决方案也适用于ruby 1.8。
830
的更新:
此解决方案不适用于830
- strptime
无法使用%l
。但是0830
可以正常工作。对于这种情况,您需要一个适应的解决方案:
require 'date' #load DateTime
%w{1400 1600 830}.each{|t|
t = '%04i' % t
p DateTime.strptime(t, '%H%M').strftime('%l:%M')
}
答案 1 :(得分:2)
这将有效,而且更容易阅读
def fomat_time(time)
time.to_s.sub(/^(\d{1,2})(\d{2})$/,'\1:\2')
end
答案 2 :(得分:0)
你可以这样做:
def format_time(time)
t = (time <= 1200)?time : time - 1200
return (t.to_s.size == 3)?t.to_s.insert(1,":") : t.to_s.insert(2,":")
end
这应该有用......