DateTime::strptime и DateTime#strftime специально созданы для этой задачи.
require 'time'
fmt_in = '%H%M%S'
fmt_out = '%I:%M:%S%p'
t = DateTime.strptime('161901', fmt_in)
t.strftime(fmt_out)
#=> "04:19:01PM
require 'time'
input = '161901'
formatted_input = input.split('').each_slice(2).to_a.map(&:join).join(':')
time = Time.parse(formatted_time)
formatted_time = time.strftime("%I:%M:%S%p")
Выход:
=> "04:19:01PM"
Лучше всего использовать "strptime" при преобразовании строк в даты или время.
Https://ruby-doc.org/stdlib-2.4.1/libdoc/time/rdoc/Time.html#method-c-strptime :
2.5.8 :006 > Time.strptime("161901","%H%M%S")
=> 2020-12-18 16:19:01 +0000
Это даст вам объект «Время», который вы сможете запрашивать, анализировать, сортировать и/или выводить в другом формате.
Вот самый простой ответ, но он делает некоторые предположения:
require 'time'
time = Time.strptime('161901', '%H%M%S')
time.strftime('%I:%M:%S%p')
=> "04:19:01PM"
Проблема в том, что ваша строка «161901» может быть дополнена или не дополнена, а также может быть целым числом, а не строкой. Например, если время было 6:00 утра, возможно, вы получите строку, такую как: «60000», вам нужно будет дополнить ее слева, чтобы правильно проанализировать ее. В связи с этим я бы предложил следующий подход:
require 'time'
# Assume your time is an integer with no right padding:
time = 61901
ptime = Time.strptime(time.to_s.rjust(6, '0'), '%H%M%S') # Do proper padding
ptime.strftime('%I:%M:%S%p')
=> "06:19:00AM"
Это должно помочь очистить вашу переменную, которую вы анализируете, для получения согласованных результатов.
Ссылки: https://ruby-doc.org/stdlib/libdoc/date/rdoc/DateTime.html#method-i-strftime
Хороший момент о возможной необходимости заполнения.
Вы можете сделать, как показано ниже, это было очень легко использовать несколько раз с переменными среды, если у вас есть фиксированный формат отображения для времени.
require 'time'
class Time
def self.strpftime(str, in_format,
out_format = ENV.fetch('out_format'))
strptime(str, in_format).strftime(out_format)
end
end
# with out using environment variable
Time.strpftime('161901', '%H%M%S', '%I:%M:%S%p')
=> "04:19:01PM"
# using environment variable
Time.strpftime('161901', '%H%M%S')
=> "04:19:01PM"
input
должно бытьtime
илиtime
должно бытьinput
. Дополнительно 1)time.split('')
может бытьtime.each_char
, чтобы избежать ненужногоArray
создания. 2)to_a
не требуется, так какmap
являетсяEnumerable
методом, это позволит избежать еще одного ненужногоArray
создания