【Ruby】strftime()メソッドを使って日時処理をコンプリート

年月日や時刻を画面に表示する処理を実装することは、アプリケーションを開発するうえで切っても切り離せません。年月日や時刻は、さまざまなフォーマットが考えられ、どのようにフォーマット処理を実装するかを理解することが最も重要です。

今回は、日時処理を実装するうえで必須となるRubyのメソッド、strftime()メソッドの使い方について解説します。具体的な日時のフォーマット方法をソースコードで示したので、実践で応用できます。ぜひ参考にしてください。

なお、Rubyの魅力や特徴については以下の記事で詳しく解説していますので、こちらもぜひご覧くださいね。

おすすめ記事

みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・Rubyってどんなプログラミング言語なの?・Rubyを勉強すると将来役に立つかな?・Rubyのおすすめの学習方法が知りたい! というお悩みを解決する記事にな[…]

Rubyとは?その特徴や将来性、おすすめの学習方法まで網羅的にご紹介します

strftime()メソッドとは?

strftime()メソッドは、RubyのTimeクラスで用意されているメソッドです。引数で指定した書式に合わせてレシーバが保有する時刻情報をフォーマットする機能を持ちます。

strftime()は、文字列を戻り値としており、画面上に年月日や時刻を表示する用途で利用されることが多いです。使い方の例を、以下のサンプルコードに示します。

# 現在時刻を示すTimeオブジェクトを作成
now_time = Time.now

# Timeオブジェクトをレシーバとしてstrftimeメソッド呼び出し
display_now_time = now_time.strftime("現在時刻;%p %I:%M")

p display_now_time # "現在時刻;PM 03:21"

strftime()メソッドは、Timeクラスのインスタンスメソッドであるため、事前にTimeオブジェクトを作成する必要があります(2行目)。

strftime()メソッドの引数は文字列で、年月日や時刻の部分は、パーセントの記号アルファベットを組み合わせた書式を使ってフォーマットします。詳細は次節を参照してください。

strftime()メソッドの書式一覧

strftime()メソッドの引数で指定できる書式には、多くの種類が存在します。ここでは、特に多く利用されるものを種類別に紹介します。

年月日の書式

年月日のフォーマットにおいて利用される書式で代表的なものは、以下の通りです。

書式意味
%Y西暦
%y西暦のうち下2桁
%m月(1~12)
%B月の英語名
%d日(1~31)

各フォーマットの出力例を、以下のサンプルコードに示します。書式指定においては、大文字と小文字が区別されているため、実装ミスがないように注意してください。

today_obj = Time.new(2021, 4, 5, 12, 34, 56)

year_text_1 = today_obj.strftime("%Y") # 西暦
year_text_2 = today_obj.strftime("%y") # 西暦(下2桁)
month_text = today_obj.strftime("%m")  # 月
month_en_text = today_obj.strftime("%B") # 月(英語名)
day_text = today_obj.strftime("%d") # 日

p year_text_1   # "2021"
p year_text_2   # "21"
p month_text    # "04"
p month_en_text # "April"
p day_text      # "05"

時刻の書式

時刻のフォーマットにおける代表的な書式は、以下の通りです。

書式意味
%H時間(24時間表記)
%I時間(12時間表記)
%M
%S
%Lミリ秒

時刻フォーマットのサンプルコードを以下に示します。

today_obj = Time.new(2021, 4, 5, 16, 34, 56)

hour_text_1 = today_obj.strftime("%H") # 時間(24時間表記)
hour_text_2 = today_obj.strftime("%I") # 時間(12時間表記)
minute_text = today_obj.strftime("%M") # 分
second_text = today_obj.strftime("%S") # 秒
milsec_text = today_obj.strftime("%L") # ミリ秒

p hour_text_1 # "16"
p hour_text_2 # "04"
p minute_text # "34"
p second_text # "56"
p milsec_text # "000"

その他の書式

その他、曜日や時刻区分などのフォーマットを指定できます。以下の表とサンプルコードを参考にしてください。

書式意味
%A曜日の英語名称
%a曜日の英語名称(省略形)
%u曜日に対応する数字(月曜日が0、日曜日が7)
%w曜日に対応する数字(日曜日が0、土曜日が7)
%P時刻区分(英大文字)
%p時刻区分(英小文字)
today_obj = Time.new(2021, 4, 4, 16, 34, 56)

week_text_1 = today_obj.strftime("%A") # 曜日(英語表記)
week_text_2 = today_obj.strftime("%a") # 曜日(英語表記省略形)
week_text_3 = today_obj.strftime("%u") # 曜日に対応する数字(月曜日が0)
week_text_4 = today_obj.strftime("%w") # 曜日に対応する数字(日曜日が0)
meridiem_text_1 = today_obj.strftime("%P") # 時刻区分(英語小文字)
meridiem_text_2 = today_obj.strftime("%p") # 時刻区分(英語大文字)

p week_text_1     # "Sunday"
p week_text_2     # "Sun"
p week_text_3     # "7"
p week_text_4     # "0"
p meridiem_text_1 # "pm"
p meridiem_text_2 # "PM"

strftime()メソッドの使用方法

ここからは、複数の書式を組み合わせて年月日や時刻などを、よく見る形にフォーマットする方法について、具体例を挙げながら解説します。

年・月・日をフォーマットする

年月日のフォーマット処理のサンプルコードを、以下に示します。

sample_date_1 = Time.new(2021, 7, 2)
sample_date_2 = Time.new(2021, 11, 22)

# 「2021/07/02」の形式でフォーマット 
format_date_1 = sample_date_1.strftime("%Y/%m/%d")
format_date_2 = sample_date_2.strftime("%Y/%m/%d")

p format_date_1 # "2021/07/02"
p format_date_2 # "2021/11/22"


# 「2021年7月2日」の形式でフォーマット
# ハイフンは、ゼロ埋めや空白埋めをしないことを示す
format_date_3 = sample_date_1.strftime("%Y年%-m月%-d日")
format_date_4 = sample_date_2.strftime("%Y年%m月%d日")

p format_date_3 # "2021年7月2日"
p format_date_4 # "2021年11月22日"

年月日をスラッシュで区切りながらフォーマットするものと、漢字で区切りながらフォーマットするものをそれぞれ実装しています。難しい点は特になく、引数で書式と文字を複数組み合わせることで、用意にフォーマット可能です。

サンプルコード5行目の出力を見ても分かるように、月・日が1桁の場合、デフォルトではゼロ埋めした状態で数字が埋め込まれます。ゼロ埋めをせずにフォーマットする場合は「%-m」「%-d」のように、パーセント記号とアルファベットの間にハイフンを追加します。

「年」「月」「日」の漢字でフォーマットする場合は、ゼロ埋めをしないことが多いので、ハイフン付きの書式はぜひ覚えておきましょう。

時・分・秒をフォーマットする

続いて、時・分・秒のフォーマットについてです。サンプルコードは、以下の通りです。

sample_date_1 = Time.new(2021, 7, 2, 3, 1, 3)
sample_date_2 = Time.new(2021, 11, 22, 13, 11, 30)

# 「03:01:03」の形式でフォーマット 
format_time_1 = sample_date_1.strftime("%H:%M:%S")
format_time_2 = sample_date_2.strftime("%H:%M:%S")

p format_time_1 # "03:01:03"
p format_time_2 # "13:11:30"


# 「3時1分3秒」の形式でフォーマット
format_time_3 = sample_date_1.strftime("%-H時%-M分%-S秒")
format_time_4 = sample_date_2.strftime("%H時%M分%S秒")

p format_time_3 # "3時1分3秒"
p format_time_4 # "13時11分30秒"

フォーマットの基本は、年月日の場合と大きな違いはありません。ゼロ埋めをせずに出力したければ、年月日の場合と同じくハイフンを書式に付け加えましょう。

日本語の曜日をフォーマットする

strftime()メソッドは、日本語の曜日(日曜日、月曜日など)を取得するための書式が用意されていません。したがって、フォーマットの際は日本語の曜日を別途用意する必要があります。サンプルコードは、以下の通りです。

# 事前に日本語の曜日文字列を用意する
week_jp_text_array = [
  "日曜日",
  "月曜日",
  "火曜日",
  "水曜日",
  "木曜日",
  "金曜日",
  "土曜日"
]

sample_date = Time.new(2021, 7, 12)

# 曜日に対応する数字を取得
week_num = sample_date.strftime("%w").to_i

# 「2021年7月12日(月曜日)」の形式でフォーマット
# 数字を配列の添字として活用
format_date_text = sample_date.strftime("%Y年%-m月%-d日(#{week_jp_text_array[week_num]})")

p format_date_text # "2021年7月12日(月曜日)"

サンプルコードでは、日本語の曜日を表す文字列を配列としてあらかじめ用意します。次に、strftime()メソッドを利用して曜日に対応する数字を取得します。この数字は、事前に用意した配列の添字です。これにより、日本語の曜日をフォーマットできます。

「午前」「午後」をフォーマットする

strftime()メソッドで「午前」「午後」の文字列を直接取得することはできません。したがって、一旦英語表記のものを取得し、日本語に変換する必要があります。サンプルコードは、以下の通りです。

meridiem_hash = {"am" => "午前", "pm" => "午後"}

sample_date_1 = Time.new(2021, 7, 2, 3, 1, 3)
sample_date_2 = Time.new(2021, 11, 22, 13, 11, 30)

meridiem_en_1 = sample_date_1.strftime("%P")
meridiem_en_2 = sample_date_2.strftime("%P")

p sample_date_1.strftime("#{meridiem_hash[meridiem_en_1]}%-I時%-M分") # "午前3時1分"
p sample_date_2.strftime("#{meridiem_hash[meridiem_en_2]}%-I時%-M分") # "午後1時11分"

今回は、英語表記の時刻区分「am」「pm」にそれぞれ「午前」「午後」を対応付けるハッシュを事前に用意しました。

strftime()メソッドでは、英語表記の時刻区分を取得できるため、これをキーにして日本語に変換する仕組みを実装できます。また「午前」「午後」を付与しながら時刻をフォーマットする場合は、時間の部分は12時間表記で指定することが多いので、注意しましょう。

お仕事の途中ですが、少し一休みして、転職独立について考えてみませんか🙌?

現役エンジニアが選ぶおすすめの転職エージェント11選【成功談・失敗談もあります】

レバテックフリーランスの評判ってどう?【現役エンジニアが徹底解説します】

MidWorks(ミッドワークス)の評判ってどう?【現役エンジニアが徹底解説します】

日々の業務に追われて自分を見失わないよう、
定期的にキャリアを振り返るようにしておきましょう🤲

最後に

さて、ここまでRubyのstrftime()メソッドの使い方について解説してきましたがいかがでしたか?

日時処理と聞くと少し複雑そうなイメージを持つ方も多いかもしれませんが、今回ご紹介した通り、Rubyのstrftime()メソッドを使用すればとても簡単に実現が可能です。

実際の開発でも必ずと言って良いほど有名なメソッドですので、今回の記事でしっかりとマスターして、今後の開発でも積極的に使っていってくださいね。

このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。

最後まで読んで頂きありがとうございました。