Это проблема манипуляции с гайкой и болтами. Можно преобразовать строки в объекты даты, а затем преобразовать эти объекты обратно в строки с заданным форматом, но проще использовать строковые методы, как я сделал ниже.
Нам дана строка с датой
str = "01/14/2018"
и будет использовать
str_fmt = "%s-%s-%s"
как строка формата.
Простейшим способом было бы извлечь интересующие части строки, используя slice метод String # [] .
str_fmt % [str[3,2], str[0,2], str[6,4]]
#=> "14-01-2018"
str_fmt % [str[6,4], str[0,2], str[3,2]]
#=> "2018-01-14"
В качестве альтернативы можно использовать регулярное выражение с группами захвата для месяца, дня и года.
r = /
\A # match the beginning of the string
(\d{2}) # match two digits in capture group 1
\/ # match a forward slash
(\d{2}) # match two digits in capture group 2
\/ # match a forward slash
(\d{4}) # match two digits in capture group 3
\z # match the end of the string
/x # free-spacing regex definition mode
str =~ r
str_fmt % [$2, $1, $3]
#=> "14-01-2018"
str_fmt % [$3, $1, $2]
#=> "2018-01-14"
Если использовать именованные группы захвата, мы напишем следующее.
m = str.match /\A(?<mon>\d{2})\/(?<day>\d{2})\/(?<yr>\d{4})\z/
str_fmt % [m[:day], m[:mon], m[:yr]]
#=> "14-01-2018"
str_fmt % [m[:yr], m[:mon], m[:day]]
#=> "2018-01-14"