2012-01-03 3 views
3

Что такое самый простой способ конвертировать военное (24-часовое время) в формат HH: MM в Ruby?Преобразование военного времени в Ruby

У меня есть два значения времени 24 часа, сохраненные в записи, и я хочу, чтобы отобразить их в представлении как нечто вроде «2:00 - 4:00», когда, начиная с двух целых чисел, скажем, 1400 и 1600.

Мой хак-й решение было создать вспомогательную функцию:

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 

Я даже не уверен, что все время работает. Я предполагаю, что есть лучший способ сделать это.

UPDATE: Мне также нужно это для работы с значениями, которые не заканчиваются на '00'. IE 1430 или 830.

ответ

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 работает также с рубином 1.8.

Обновление для 830: Это решение не будет работать с 830 - strptime не accpt %l. Но 0830 будет работать нормально. В этом случае вам нужно адаптированное решение:

require 'date' #load DateTime 

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

Это не сработало для меня. Получил ошибку «no method error», пытающуюся вызвать Time.strptime. Примечание: в этом проекте используется Ruby 1.8.7 –

+0

Я добавил версию с DateTime. Я думаю, что это будет работать и с ruby ​​1.8 (извините, я не могу проверить его сам) – knut

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 

Это должно работать ...

2

Это будет работать, и это легче прочитать о

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

Спасибо, регулярное выражение имеет смысл использовать там. –

0

Если у Вас всегда есть раз в виде целых чисел, такими как, например, как 1600, 1630, 930 или 130, то это может быть решением:

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" 
+0

Я хочу использовать этот метод, но ему нужно работать в разы, которые не заканчиваются на 00. –

+0

Итак, как ваши времена выглядит как? Являются ли они целыми числами и т. Д.? – maprihoda

+0

Да, все целые числа, такие как 1600, 1630, 930 или 130 –

Смежные вопросы