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

  • 2021年7月15日
  • 2021年10月16日
  • Ruby

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

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

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

おすすめ記事

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

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

レバテックフリーランス … 業界最大級の案件数業界トップクラスの高単価報酬を誇る最大手のサービスです。実績豊富なコーディネーターが丁寧な対応をしてくれるため、案件の無理な提案はありません。フリーランスで生きていくためにはまず登録しておきましょう。
MidWorks … フリーランス賠償責任保障生命保険の折半など、フリーランスでありながらも正社員並みの保障を受けられるのが特徴です。また、経験豊富なキャリアコンサルタントによる手厚いサポートも受けられるため、安定したフリーランス生活を送りたい方には特におすすめのサービスです。
ポテパンフリーランス … IT業界・技術に詳しいコンサルタントが担当してくれるため、こちらの要望をきちんと理解した上で案件を紹介してくれます。また、案件情報のみならず、フリーランスのイロハについても教えてくれるため、フリーランスとして初めて活動される方には特におすすめのサービスです。

レバテックキャリア … ITエンジニアが利用したい転職エージェントNo.1にも選ばれており、年収600万円以上のハイクラス求人を5,000件以上も保有しています。エンジニアが転職を考えた時にまず初めに登録しておくべきサービスです。
Tech Stars Agent … Tech Stars Agentでは、担当エージェントが全員エンジニア出身のため、スキルやキャリアを見据えたきめ細かな転職支援が受けられます。運営元の株式会社Branding Engineerは、独立支援サービス「MidWorks」も展開しているため、独立を視野に入れたサポートも受けられます
転職ドラフト … 年収UP率93.8%/平均年収UP額126万円と圧倒的な年収UP率を誇るイベント型のエンジニア向け 転職サービスです。毎月1回開催され、厳選された優良IT/Web系企業約150社からダイレクトスカウトを受け取ることができます。年収アップを目指す方は登録必須です。

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()メソッドを使用すればとても簡単に実現が可能です。

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

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

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