Rubyで日付を文字列に変換する方法:strftime
Rubyでは、主に3種類のクラスで日付や時刻を処理します。
- Timeクラス
- DateTimeクラス(日付、時刻)
- Dateクラス(日付)
ここでは、それぞれのクラスごとに、日付を文字列に変換する方法を説明します。日付・日時フォーマットは、ページ下部の付録を参照してください。
目次
Timeクラスのstrftimeメソッド
Timeクラスのstrftimeメソッドで、文字列を指定のフォーマットで表示できます。
t.strftime(フォーマット)
サンプル
Timeクラスのnowメソッドで現在時刻を取得し変数tに代入し、strftimeメソッドで指定フォーマットの文字列に変換しています。
t = Time.now
t.strftime("%a %b %d %H:%M:%S %z %Y")
#=> "Thu Apr 14 20:48:12 +0900 2016"
DateTimeクラスのstrftimeメソッド
DateTimeクラスは、dateライブラリを呼び出してから使います。strftimeメソッドの使い方は、Timeクラスと同じです。
サンプル
require 'date'
t = DateTime.now
p t.strftime("%Y/%m/%d %H:%M:%S") #=> "2016/04/14 21:45:22"
Dateクラスのstrftimeメソッド
次に、Dateクラスを使う方法を説明します。Dateクラスは時刻を持たない日付だけのクラスです。DateTimeと同じく、dateライブラリを読み込んでから使います。
サンプル
Dateクラスでも、strftimeメソッドが使え、フォーマットの指定方法も同じです。
require 'date'
d = Date.today
d.strftime("%Y/%m/%d %H:%M:%S") => "2016/04/14 00:00:00"
ただし、Dateクラスは日付しか保持していないので、時刻を指定しても、上のようにその部分の値はすべてゼロになります。
TimeクラスとDateTimeクラスの違い
TimeクラスとDateTimeクラスは、以前であれば実行速度や2038年問題などの違いがあったそうですが、今ではどちらも改善され両者に大きな違いはありません。
requireの有無
Timeクラスはrequireなしで使えますが、DateTimeクラスはrequireが必要。
単位の違い
DateTimeクラスの場合、「+1」すると1日後になるが、Timeクラスの場合は1秒後となる。
require "date"
dt = DateTime.now + 1
p dt.strftime("%Y/%m/%d %H:%M:%S")
#=> "2016/05/24 15:08:46"
t = Time.now + 1
p t.strftime("%Y/%m/%d %H:%M:%S")
#=> "2016/05/23 15:08:47"
その他、細かい違いはありますが、基本はrequireなしで扱えるTimeクラスを使えば良いでしょう。(*Ruby on Railsで日付を扱う場合はまた異なります)
付録:Rubyの日付・時間フォーマット
| %A | 曜日の名称(Sunday, Monday … ) |
| %a | 曜日の省略名(Sun, Mon … ) |
| %B | 月の名称(January, February … ) |
| %b | 月の省略名(Jan, Feb … ) |
| %C | 世紀 (2009年であれば 20) |
| %c | 日付と時刻 |
| %D | 日付 (%m/%d/%y) |
| %d | 日(01-31) |
| %e | 日。一桁の場合、半角空白で埋める ( 1..31) |
| %F | %Y-%m-%d と同等 (ISO 8601の日付フォーマット) |
| %H | 24時間制の時(00-23) |
| %h | %b と同等 |
| %I | 12時間制の時(01-12) |
| %j | 年中の通算日(001-366) |
| %k | 24時間制の時。一桁の場合、半角空白で埋める ( 0..23) |
| %L | ミリ秒 (000.999) |
| %l | 12時間制の時。一桁の場合、半角空白で埋める ( 0..12) |
| %M | 分(00-59) |
| %m | 月を表す数字(01-12) |
| %n | 改行 (\n) |
| %N | 秒の小数点以下。桁の指定がない場合は9桁(ナノ秒) |
| %P | 午前または午後(am,pm) |
| %p | 午前または午後(AM,PM) |
| %R | 24時間制の時刻。%H:%M と同等。 |
| %r | 12時間制の時刻。%I:%M:%S %p と同等。 |
| %S | 秒(00-60) (60はうるう秒) |
| %s | 1970-01-01 00:00:00 UTC からの経過秒 |
| %T | 24時間制の時刻。%H:%M:%S と同等。 |
| %t | タブ文字 (\t) |
| %U | 週を表す数。最初の日曜日が第1週の始まり(00-53) |
| %u | 月曜日を1とした、曜日の数値表現 (1..7) |
| %v | VMS形式の日付 (%e-%b-%Y) |
| %V | ISO 8601形式の暦週 (01..53) |
| %W | 週を表す数。最初の月曜日が第1週の始まり(00-53) |
| %w | 曜日を表す数。日曜日が0(0-6) |
| %X | 時刻 |
| %x | 日付 |
| %Y | 西暦を表す数 |
| %y | 西暦の下2桁(00-99) |
| %Z | タイムゾーン |
| %z | タイムゾーン。UTCからのオフセット (例 +0900) |
| %:z | タイムゾーン。コロンが入ったUTCからのオフセット (例 +09:00) |
| %::z | タイムゾーン。コロンが入った秒まで含むUTCからのオフセット (例 +09:00:00) |
| %% | %自身 |