/ / Ruby - Добавяне на всяко число в масива игнорирайки „AM” / „PM” - рубин, масиви

Ruby - Добавяне към всеки номер в масив игнорирайки "AM" / "PM" - рубин, масиви

Имам привидно прост въпрос за noobie, но не мога да намеря отговора чрез Google. Имам масив от време (само час): ["08 AM", "09 AM", "07 AM", "11 AM", "03 PM", "12 PM"], Искам да направя друг масив, съдържащ всеки от тези времена плюс 1 час, така че той ще изведе: ["09 AM", "10 AM", "08 AM", "12 PM", "04 PM", "01 PM"]

Вероятно има прост начин да направите това, но другото би било да се справите с промяната от AM към PM, ако имам 11 AM, и да добавя час, за да получа 12 PM.

Отговори:

2 за отговор № 1

Използва разбор на време и форматиране. require "time" е необходимо за използване на Time.parse метод.

require "time"
arr = ["08 AM", "09 AM", "07 AM", "11 AM", "03 PM", "12 PM"]

arr.map do |time|
time = Time.parse(time)
time += 60 * 60
time.strftime("%I %p")
end
# => ["09 AM", "10 AM", "08 AM", "12 PM", "04 PM", "01 PM"]

time += 60 * 60 добавя един час към времето, или 60 minutes x 60 seconds.

time.strftime("%I %p") форматира времето, използвайки тези директиви:

  • %I - Час на деня, 12-часов часовник, подплатен с нула (01..12)
  • %p - индикатор за меридиан, главни букви (AM или PM)

Ако харесвате еднолинейни:

arr.map { |t| (Time.parse(t) + 3600).strftime("%I %p") }

1 за отговор № 2

Бихте могли да го направите така.

a = ["12 AM", *("01".."11").map { |a| "#{a} AM" },
"12 PM", *("01".."11").map { |a| "#{a} PM" }]
h = Hash[a.zip(a.rotate(1))]
#=> {"12 AM"=>"01 AM", "01 AM"=>"02 AM", "02 AM"=>"03 AM", "03 AM"=>"04 AM",
#    "04 AM"=>"05 AM", "05 AM"=>"06 AM", "06 AM"=>"07 AM", "07 AM"=>"08 AM",
#    "08 AM"=>"09 AM", "09 AM"=>"10 AM", "10 AM"=>"11 AM", "11 AM"=>"12 PM",
#    "12 PM"=>"01 PM", "01 PM"=>"02 PM", "02 PM"=>"03 PM", "03 PM"=>"04 PM",
#    "04 PM"=>"05 PM", "05 PM"=>"06 PM", "06 PM"=>"07 PM", "07 PM"=>"08 PM",
#    "08 PM"=>"09 PM", "09 PM"=>"10 PM", "10 PM"=>"11 PM", "11 PM"=>"12 AM"}

ако

arr = ["08 AM", "09 AM", "07 AM", "11 AM", "03 PM", "12 PM"]

тогава

arr.map { |t| h[t] }
#=> ["09 AM", "10 AM", "08 AM", "12 PM", "04 PM", "01 PM"]

или

h.values_at(*arr)
#=> ["09 AM", "10 AM", "08 AM", "12 PM", "04 PM", "01 PM"]

0 за отговор № 3
1- use time.parse to parse your string to time object
2- add hour to your time object
3- convert it back to string using time.strftime