Сделать отметку времени из строки

Мне нужно отформатировать 161901 в 04:19:01PM.

Я пробовал следующее:

Time.parse(161901)
"161901".chars.each_slice(2).map(&:join)
Time.parse("161901".chars.each_slice(2).map(&:join))

Будучи новичком в рубине, трудно найти способ.

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
0
88
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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"
input должно быть time или time должно быть input. Дополнительно 1) time.split('') может быть time.each_char, чтобы избежать ненужного Array создания. 2) to_a не требуется, так как map является Enumerable методом, это позволит избежать еще одного ненужного Array создания
engineersmnky 18.12.2020 21:54

Лучше всего использовать "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

Хороший момент о возможной необходимости заполнения.

Cary Swoveland 18.12.2020 20:08

Вы можете сделать, как показано ниже, это было очень легко использовать несколько раз с переменными среды, если у вас есть фиксированный формат отображения для времени.

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"

Другие вопросы по теме