webエンジニアの日常

RubyやPython, JSなど、IT関連の記事を書いています

Railsのstrftimeの引数を調べた(スクレイピングで)

f:id:s-uotani-zetakansu:20170822124329j:plain

こんにちは、エンジニアのさもです。

Railsのstrftimeメソッドってめっちゃ便利ですよね。

webアプリを作っていると日時っていろんなフォーマットで表示する必要があるので、よく使っています。

今回、英語圏の方用にフォーマットを作っていたのですが、pm、amとか月の英語表示とかも使えて、さらに便利だなと思いました。

そこで、どんな引数があるのかRuby on Railsドキュメントで調べてみてみました。

スポンサーリンク

ページを開くと表形式で一覧が載っていますね。

でも、%Xのところをみてると、「時刻」としか書いてないです。

何が表示されるのか試そうとしたのですが、いっそうのこと、このページをスクレイピングして、全部試してみようと思ったのです。

rubyでのスクレイピング&クローリングの基本的な書き方は、以下のエントリに書きました。今回は特に解説しないので、何をやってるんだという方は見てみてください。

www.uosansatox.biz

以下、コードです。

require 'open-uri'
require 'robotex'
require 'erb'

railsdoc_url = "http://railsdoc.com/references/strftime"

@codes = []
@current_time = Time.now

if Robotex.new("Crawler").allowed?(railsdoc_url)
  open(railsdoc_url) do |file|
    page = file.read
    # テーブル内で、%なんとかってなっている行を探す
    page.scan(/<tr>(.*?)<td>\%(.*?)<\/td>(.*?)<td>(.*?)<\/td>(.*?)<\/tr>/).each do |time|
      @codes << {
        code:    time[1], # %AのAを取得
        context: time[3].encode("utf-8"),# 説明を取得
        sample:  @current_time.strftime("%#{time[1]}") # 実行例を取得
      }
    end
  end
   # htmlファイルを作成
  File.open("./time_format.html", "w") do |file|
    file.puts(ERB.new(File.read("./time_format.html.erb")).result(binding))
  end
end

次に結果表示用のerbファイルです。

上記のrubyコードと同じフォルダにtime_format.html.erbという名前で保存してください。

<%= @current_time %>
<table border="1">
  <tr><th>記号</th><th>サンプル</th><th>説明</th></tr>
  <% @codes.each do |code| %>
    <tr>
      <td>%<%= code[:code] %> </td>
      <td><%= code[:sample] %> </td>
      <td><%= code[:context] %> </td>
    </tr>
  <% end %>
</table>

実行すると、time_format.htmlというファイルが出来たかと思います。

ブラウザで表示するとこんな感じです。

2017-09-15 16:37:51 +0900

記号サンプル説明
%A Friday 曜日の名称(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
%a Fri 曜日の省略名(Sun, Mon, Tue, Wed, Thu, Fri, Sat)
%B September 月の名称(January, February, March, April, May, June, July, August, September, October, November, December)
%b Sep 月の省略名(Jan, Feb, Mar, Aprm May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
%c Fri Sep 15 16:37:51 2017 日付と時刻
%d 15 日(01-31)
%H 16 24時間制の時(00-23)
%I 04 12時間制の時(01-12)
%j 258 年中の通算日(001-366)
%M 37 分(00-59)
%m 09 月を表す数字(01-12)
%p PM 午前または午後(AM,PM)
%S 51 秒(00-60) (60はうるう秒)
%U 37 週を表す数。最初の日曜日が第1週の始まり(00-53)
%W 37 週を表す数。最初の月曜日が第1週の始まり(00-53)
%w 5 曜日を表す数。日曜日が0(0-6)
%X 16:37:51 時刻
%x 09/15/17 日付
%Y 2017 西暦を表す数
%y 17 西暦の下2桁(00-99)
%Z JST タイムゾーン
%% % パーセント文字

最後に

スクレイピングたのしいですね。あと標準でerbが入っているところもすばらしいです。

ただ、なぜかwindows上のrubyでは文字コードが上手く変換されず、centos上のrubyで実行しました。

windows上で実行される方は注意が必要です。

読者登録をしていただけると、ブログを続ける励みになりますので、よろしくお願いします。