dates.map { |e| Date.parse(e).strftime('%Y-%m-%d') }
#=> ["1232-10-20", "2019-06-06", "2017-08-23", "2015-01-09"]
Измените шаблон '%Y-%m-%d'
в соответствии с вашими потребностями, см. Это для справки: Дата # strftime .
Принятие мудрого предложения от Кэри Свовеланд.
Вместо Date.parse(e)
вы можете использовать Date.strptime(e, '%dth %b %Y')
, который работает более или менее наоборот strftime. См. Date # strptime . Он следует шаблону ('%dth %b %Y'
) для интерпретации исходной строки как даты. Добавление th
к шаблону после %d
(дня) приводит к правильному преобразованию текущего формата в объект даты:
Date.strptime("20th OCT 1232", '%dth %b %Y') #=> #<Date: 1232-10-20 ((2171339j,0s,0n),+0s,2299161j)>
Но что, если дата будет '1st OCT 2018'
или '23rd OCT 2018'
? Шаблон не соответствует, потому что он ожидает найти th
, а не st
или rd
.
Чтобы быть порядковым суффиксом , приходит в руки метод String # sub :
"20th OCT 1232".sub(/(?<=\d)\p{Alpha}+/, '') #=> "20 OCT 1232"
Итак, смешивая все вместе, лучшее решение для безопасности должно быть:
dates.map { |e| Date.strptime(e.sub(/(?<=\d)\p{Alpha}+/, ''), '%d %b %Y').strftime('%Y-%m-%d') }