• ベストアンサー

Rubyにおけるファイル作成日(yyyy/mm/dd)の求め方

Rubyを使って、テキスト処理をしようとしています。 ファイル作成日を取り出す必要があり、 p File::mtime(filename) を使っています。しかし、これの出力は、 Wed Apr 25 17:44:44 +0900 2007 このような、フォーマットです。 普通に、 2007/04/25 の形で使いたいのです。 (1)ライブラリは、あるのでしょうか?    ある場合には、それの呼び出す方法も併せて教えていただけないでしょうか? (2)サブルーチンを作る場合には、その作り方を教えていただけないでしょうか? 当方、Rubyを始めたばかりなものですから、本当に申し訳ない。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

File.mtime の戻り値は Time オブジェクトだから、後は Time#strftime などでフォーマットすれば良いのでは? File::mtime(filename).strftime('%Y/%m/%d') かな?

noname#95859
質問者

補足

koko_u_さん、ありがとうございます。 うまく行きました。1行で終わるとは、考えていませんでした。感激です。 しかし、勉強のために、教えてください。 サブルーチンを検討していました。 スクリプトの先頭で、defで定義しました。 型変換のところで、ぶつかっております。 # --format change "Tue May 01 00:00:00 JST 2001" --> 2001/05/01 def formatchange(rubydate) (/\w+\s(\w+)\s(\d+)\s\S+\s\S+\s(\d+)/=~rubydate.to_s) && (myMonth=$1;myDay=$2;myYear=$3) myMonth= myMonth.sub(/Jan/,'01') myMonth= myMonth.sub(/Feb/,'02') myMonth= myMonth.sub(/Mar/,'03') myMonth= myMonth.sub(/Apr/,'04') myMonth= myMonth.sub(/May/,'05') myMonth= myMonth.sub(/Jun/,'06') myMonth= myMonth.sub(/Jul/,'07') myMonth= myMonth.sub(/Aug/,'08') myMonth= myMonth.sub(/Sep/,'09') myMonth= myMonth.sub(/Oct/,'10') myMonth= myMonth.sub(/Nov/,'11') myMonth= myMonth.sub(/Dec/,'12') myFiledate=myYear+'/'+myMonth+'/'+myDay return myFiledate end これは、まだ、うまく動いておりません。 型変換のところが問題です。サジェスチョンをお願いできますか?

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.6

ちょろっとソースを見た感じでは Ruby では locale を見てはいないようですな。(というか locale の指定方法すらわからん)

noname#95859
質問者

お礼

コメントありがとうございます。 今後の参考にさせていただきます。

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

locale ってのはわかりやすく云うと、国や地域、文化圏に固有な表記などを 扱うための仕組みです。 日付の表記もそのうちのひとつですし、ほかには小数点表記とかソートの規則などがあります。 現行のRubyだといい例がだせないのでCでちょっとサンプルを。 #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <time.h> int main() { char strbuf[256]; time_t now; struct tm *tm_now; time(&now); tm_now = localtime(&now); setlocale(LC_ALL, "C"); strftime(strbuf, sizeof strbuf, "%c %a %b", tm_now); printf("%s\n", strbuf); setlocale(LC_ALL, "japanese_japan.932"); strftime(strbuf, sizeof strbuf, "%c %a %b", tm_now); printf("%s\n", strbuf); return 0; } 実行結果は以下のとおり。 05/06/07 00:11:44 Sun May 2007/05/06 0:11:44 日 5 というわけで環境でこのように変わる可能性があるものについては 決めうちでやるのは危険だから避けようねということです。

noname#95859
質問者

お礼

sakusaker7さん、ありがとうございます。大変よく分かりました。 今後、勉強していく上で、助かります。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.4

あともうひとつアドバイス。 mtimeの結果は"Wed Apr 25 17:44:44 +0900 2007"のような文字列じゃなくTimeクラスの値です。ただ、そのままでは画面に表示できないので、inspectメソッドで文字列に変換したものが表示されます。 もし、mtime の結果が文字列だと勘違いして正規表現でマッチさせようとしているなら無理です。File.mtime(filename).inspect が文字列になります。

noname#95859
質問者

お礼

ありがとうございます。 ご指摘の通り、mtime の結果を文字列だと考えてて、正規表現でマッチさせようとしていました。Timeクラスを勉強します。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

#2の意見であらかたすんでると思いますがひとつ。 自前でやろうとしているメソッド(サブルーチン)ですけど、 locale が変わったときの柔軟性がまるでないのが気になります。 現状のRubyでは(プラットフォームによってはわかりませんが)その コードで問題ないとしても、将来どうなるかわかりません。 日付文字列から日付及び時刻のデータを得るには、 ParseDate.persedate を使うと楽できるでしょう。

noname#95859
質問者

お礼

ありがとうございます。 locale が変わったときの・・・ localeの言葉の意味するものがよく分かっていません。 大変申し訳ないのですが、教えていただけませんか?

すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

一般的なアドバイスとしては ・あるものは使う。自分で書かない 文字列から Date オブジェクトを得るにも Date.strptime があるのでそれを使う。 最終的にやりたいことは日付のフォーマット変換ではないのでしょうから、プログラミングのコア部分に集中するのがよろしいかと。 一応、コードについてもコメントすると、 ・rubydate.to_s でいきなり文字列に変換してしまっているが、rubydate が Date オブジェクトなら rubydate.year なりで正規表現を待つまでもなく'年'のみなどを取り出せる。 ・Jan -> 01, Feb -> 02 の置換の箇所は明らかに Hash を使うべきだろう。 ・正規表現がマッチしなかった場合に、myMonth などが未定義でそれ以降のコードがエラーとなる。'月'の箇所のマッチ文字列が hoge など無関係な文字であった場合の対応もない。 ・最後の式の値が勝手に戻り値になるので return 文はいらない こんな感じ? などと偉そうに言いながら、私も Ruby 歴1週間なのであんまり気にしないように。

noname#95859
質問者

お礼

本当に参考になります。 随分、長いこと、Rubyが気になっていましたが、やっと、実際の 業務に使う決心をして、取り組んだところです。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A