在Ruby中转换军事时间

时间:2012-01-03 20:21:07

标签: ruby time format

在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。

3 个答案:

答案 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

这应该有用......