Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Ruby转换军事时间_Ruby_Time_Format - Fatal编程技术网

用Ruby转换军事时间

用Ruby转换军事时间,ruby,time,format,Ruby,Time,Format,在Ruby中将军事(24小时)转换为HH:MM格式的最简单方法是什么 我在一个记录中存储了两个24小时时间值,我想在视图中以两个整数值(比如1400和1600)开始时显示它们,类似于“2:00-4:00” 我的hack-y解决方案是创建一个helper函数: def format_time(time) if (time-1200 < 1000) if (time-1200 < 100) return tim

在Ruby中将军事(24小时)转换为HH:MM格式的最简单方法是什么

我在一个记录中存储了两个24小时时间值,我想在视图中以两个整数值(比如1400和1600)开始时显示它们,类似于“2:00-4:00”

我的hack-y解决方案是创建一个helper函数:

    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
def格式_时间(time)
如果(时间-1200<1000)
如果(时间-1200<100)
返回时间.至插入(2,“:”)
其他的
返回(time-1200)。至美国。插入(1,“:”)
结束
其他的
返回(time-1200)。至美国。插入(2,“:”)
结束
结束
我甚至不确定这是否一直有效。我想有更好的办法


更新:我还需要这个来处理不以“00”结尾的值。IE 1430或830。

您可以这样做:

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
def格式_时间(time)

t=(时间这会起作用,而且更容易阅读

def fomat_time(time)
  time.to_s.sub(/^(\d{1,2})(\d{2})$/,'\1:\2')
end

您可以使用
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
-
strtime
不接受
%l
。但是
0830
可以正常工作。在这种情况下,您需要一个适应的解决方案:

require 'date'  #load DateTime

%w{1400 1600 830}.each{|t|
  t = '%04i' % t
  p DateTime.strptime(t, '%H%M').strftime('%l:%M')
}
require 'time'

def format_time(time)
  # normalize time
  time = time.to_s.rjust(4, '0') if time[0] !~ /[12]/
  time = time.to_s.ljust(4, '0') if time[0] =~ /[12]/

  Time.strptime(time, '%H%M').strftime('%l:%M').strip
end

time = 900
p format_time(time) # "9:00"

time = 1630
p format_time(time) # "4:30"

time = 930
p format_time(time) # "9:30"

time = 130
p format_time(time) # "1:30"

如果时间总是以整数形式存在,例如1600、1630、930或130,那么这可能是一个解决方案:

require 'date'  #load DateTime

%w{1400 1600 830}.each{|t|
  t = '%04i' % t
  p DateTime.strptime(t, '%H%M').strftime('%l:%M')
}
require 'time'

def format_time(time)
  # normalize time
  time = time.to_s.rjust(4, '0') if time[0] !~ /[12]/
  time = time.to_s.ljust(4, '0') if time[0] =~ /[12]/

  Time.strptime(time, '%H%M').strftime('%l:%M').strip
end

time = 900
p format_time(time) # "9:00"

time = 1630
p format_time(time) # "4:30"

time = 930
p format_time(time) # "9:30"

time = 130
p format_time(time) # "1:30"

这对我不起作用。尝试调用Time.strtime时出现“无方法错误”。注意:此项目使用Ruby 1.8.7我添加了一个带有DateTime的版本。我想,这也适用于Ruby 1.8(抱歉,我自己无法测试)谢谢,在那里使用正则表达式很有意义。我想使用这个方法,但需要它在不以00结尾的时间上工作。那么你的时间是什么样子的?它们是整数等吗?请参阅我的更新答案(请彻底测试,因为输入时间非常不寻常-您还可以查看它们是如何构造的/它们来自何处以及以何种形式出现的,等等)