質問: ▪️知りたいこと 下記パターンの文字列としての日付が引数として渡された場合、文字列YYYY-MM-dd形式で返す関数 12018年4月1日 結果: 2018-04-01 22018年4月10日 結果:2018-04-10 32018年10月1日 結果: 2018-10-01 42018年10月10日 結果: 2018-10-10 ▪️質問 Ruby初心者です。上記4パターンの文字列としての日付が渡された場合、文字列YYYY-MM-ddの形式で返す関数が分かりません。ご教示頂けると幸いです。
回答: こんにちは。 Date.strptime を使って、`2018年4月1日`から日付オブジェクトを作り、 それをDate#strftime でフォーマットを与えて文字列にすれば、 `2018-04-01`が得られると思います。 以下のような感じです。 ``` require 'date' %w[ 2018年4月1日 2018年4月10日 2018年10月1日 2018年10月10日 ].each do |date_str| puts Date.strptime(date_str, '%Y年%m月%d日').strftime('%Y-%m-%d') end ``` 上記を実行すると、以下のように出力されます。 > > 2018-04-01 > > 2018-04-10 > > 2018-10-01 > > 2018-10-10 > > > **補足** 質問の趣旨から外れるかもしれませんが、`Date`のメソッドを使わずに、 `2018年4月1日`から、年月日それぞれの数字を取得するために正規表現を使い、 それらを `2018-04-01` にするのに、 sprintf を使う手もあります。 ``` %w[ 2018年4月1日 2018年4月10日 2018年10月1日 2018年10月10日 ].each do |date_str| if /^(\d{4})年(\d{1,2})月(\d{1,2})日$/ =~ date_str puts sprintf('%4d-%02d-%02d',$1, $2, $3) end end ```