Преобразование военного времени в Руби - PullRequest
3 голосов
/ 04 января 2012

Какой самый простой способ преобразовать военные (24-часовой формат) в формат ЧЧ: ММ в 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

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

ОБНОВЛЕНИЕ: мне также нужно, чтобы это работало со значениями, которые не заканчиваются на '00'.IE 1430 или 830.

Ответы [ 4 ]

7 голосов
/ 04 января 2012

Вы можете проанализировать строку с помощью 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')
}
2 голосов
/ 04 января 2012

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

def fomat_time(time)
  time.to_s.sub(/^(\d{1,2})(\d{2})$/,'\1:\2')
end
0 голосов
/ 04 января 2012

Если у вас всегда есть времена в виде целых чисел, например, например, 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 голосов
/ 04 января 2012

Вы можете сделать что-то вроде этого:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...