日付と時刻の基本的な扱い方を学ぼう
学習の目標
本章では、以下の内容を学習します。
- Rubyで現在の日時を取得する方法を理解する
- 日時から年、月、日、時、分、秒などの情報を取り出す方法を習得する
- 日付や時刻を見やすい形式にフォーマットする方法を学ぶ
- 特定の日時を作成する方法を理解する
- 日付と時刻の扱い方の基本を身につける
はじめに
私たちが作るプログラムでは、日付や時刻を扱う場面がよくあります。例えば、以下のようなケースが考えられます。
- ブログ記事の投稿日時を表示する
- イベントの開催日をカレンダーに登録する
- ユーザーの登録日や最終ログイン日時を記録する
- 商品の発売日や予約開始日を管理する
- プログラムの実行時間を計測する
Rubyには、このような日付や時刻を簡単に扱うための機能が標準で用意されています。この章では、その基本的な使い方を学んでいきましょう。
現在の日時を取得する
Time.nowメソッド
Rubyで現在の日時を取得するには、Time.nowメソッドを使います。このメソッドを実行すると、その時点の日時情報が含まれたTimeオブジェクトが返されます。
VS Codeでtime_date.rbというファイルを作成し、以下のコードを入力してみましょう。
# 現在の日時を取得しますcurrent_time = Time.now
# 取得した日時を表示しますputs "現在の日時: #{current_time}"このプログラムを実行すると、以下のような結果が表示されます(表示される日時は実行した時点のものになります)。
現在の日時: 2025-05-13 15:30:45 +0900Time.nowで取得した日時は、年、月、日、時、分、秒、そしてタイムゾーン(上の例では+0900で、日本標準時を表しています)の情報を含んでいます。
日時から情報を取り出す
Timeオブジェクトからは、年や月、日などの情報を個別に取り出すことができます。以下のメソッドを使って必要な情報を取得できます。
# 現在の日時を取得current_time = Time.now
puts "現在の日時: #{current_time}"puts "年: #{current_time.year}"puts "月: #{current_time.month}"puts "日: #{current_time.day}"puts "時: #{current_time.hour}"puts "分: #{current_time.min}"puts "秒: #{current_time.sec}"実行すると、以下のような結果が表示されます(実行時の日時により異なります)。
現在の日時: 2025-05-13 15:30:45 +0900年: 2025月: 5日: 13時: 15分: 30秒: 45このように、Timeオブジェクトから年、月、日、時、分、秒などの情報を簡単に取り出すことができます。これらの情報を使えば、「今日は○月○日です」というような表示や、「今は営業時間内か?」という判断などができるようになります。
曜日を取得する
曜日もwdayメソッドで取得できます。このメソッドは0(日曜日)から6(土曜日)までの数値を返します。
# 現在の日時を取得current_time = Time.now
# 曜日を取得(0:日曜日, 1:月曜日, ..., 6:土曜日)day_of_week = current_time.wday
# 曜日の名前を配列で用意week_days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]
puts "今日は#{week_days[day_of_week]}です"実行すると、以下のような結果が表示されます(実行する曜日によって変わります)。
今日は火曜日ですこの例では、wdayメソッドで取得した数値を使って、曜日の名前が格納された配列から対応する曜日を表示しています。
日付の形式を整える
strftimeメソッド
日付や時刻を見やすい形式で表示したい場合、strftimeメソッドを使います。このメソッドを使うと、日時の表示形式を自由にカスタマイズできます。
# 現在の日時を取得current_time = Time.now
# 日本語の形式で表示formatted_date = current_time.strftime("%Y年%m月%d日")puts "日付: #{formatted_date}"
# 時刻も含めて表示formatted_datetime = current_time.strftime("%Y年%m月%d日 %H時%M分%S秒")puts "日時: #{formatted_datetime}"実行すると、以下のような結果が表示されます(実行時の日時により異なります)。
日付: 2025年05月13日日時: 2025年05月13日 15時30分45秒strftimeメソッドは、フォーマット文字列を引数に取ります。フォーマット文字列には、%Yや%mのような特殊な記号(フォーマット指定子)を含めることができ、これらは実際の日時の値に置き換えられます。
主なフォーマット指定子
strftimeメソッドで使用できる主なフォーマット指定子は以下の通りです。
- %Y- 年(4桁の数字、例:2025)
- %y- 年(2桁の数字、例:25)
- %m- 月(01〜12)
- %d- 日(01〜31)
- %H- 時(24時間形式、00〜23)
- %I- 時(12時間形式、01〜12)
- %M- 分(00〜59)
- %S- 秒(00〜59)
- %A- 曜日の名前(Sunday, Monday, ...)
- %a- 曜日の短縮名(Sun, Mon, ...)
- %B- 月の名前(January, February, ...)
- %b- 月の短縮名(Jan, Feb, ...)
- %p- 午前/午後(AM, PM)
これらの指定子を組み合わせることで、様々な形式で日時を表示できます。
一つひとつ覚える必要はありませんが、よく使うものを覚えておくと便利です。特に、%Y(年)、%m(月)、%d(日)、%H(時)、%M(分)、%S(秒)は頻繁に使用されるので、覚えておくと良いでしょう。
様々な日時表示の例
いくつか、よく使われる日時表示の例を見てみましょう。
コピペでもOKですので、VS Codeに以下のコードを入力して実行してみてください。
# 現在の日時を取得current_time = Time.now
# 様々な形式で表示puts "ISO 8601形式: #{current_time.strftime("%Y-%m-%d")}"puts "日本の一般的な形式: #{current_time.strftime("%Y年%m月%d日")}"puts "アメリカの一般的な形式: #{current_time.strftime("%m/%d/%Y")}"puts "時刻(24時間形式): #{current_time.strftime("%H:%M:%S")}"puts "時刻(12時間形式): #{current_time.strftime("%I:%M %p")}"puts "日時の完全な表記: #{current_time.strftime("%Y年%m月%d日 %H時%M分%S秒")}"実行すると、以下のような結果が表示されます(実行時の日時により異なります)。
ISO 8601形式: 2025-05-13日本の一般的な形式: 2025年05月13日アメリカの一般的な形式: 05/13/2025時刻(24時間形式): 15:30:45時刻(12時間形式): 03:30 PM日時の完全な表記: 2025年05月13日 15時30分45秒このように、strftimeメソッドを使うと、様々な形式で日時を表示することができます。プログラムの目的や対象のユーザーに合わせて、適切な形式を選ぶとよいでしょう。
指定した日時を作成する
Time.newメソッド
特定の日時を表すTimeオブジェクトを作成したい場合は、Time.newメソッドを使います。このメソッドには、年、月、日、時、分、秒などの値を引数として渡します。
# 2024年1月1日の10時20分30秒を作成new_year = Time.new(2024, 1, 1, 10, 20, 30)
puts "作成した日時: #{new_year}"puts "日本語形式: #{new_year.strftime("%Y年%m月%d日 %H時%M分%S秒")}"実行すると、以下のような結果が表示されます。
作成した日時: 2024-01-01 10:20:30 +0900日本語形式: 2024年01月01日 10時20分30秒Time.newメソッドには、最低でも年を指定する必要があります。他の引数(月、日、時、分、秒)は省略可能で、省略した場合はデフォルト値(通常は1または0)が使用されます。
日時を部分的に指定する
すべての項目を指定しなくても、一部だけを指定して日時を作成することもできます。
# 年だけ指定(他は自動的に設定される)time1 = Time.new(2024)puts "年だけ指定: #{time1}"
# 年と月を指定time2 = Time.new(2024, 5)puts "年と月を指定: #{time2}"
# 年、月、日を指定time3 = Time.new(2024, 5, 15)puts "年、月、日を指定: #{time3}"実行すると、以下のような結果が表示されます。
年だけ指定: 2024-01-01 00:00:00 +0900年と月を指定: 2024-05-01 00:00:00 +0900年、月、日を指定: 2024-05-15 00:00:00 +0900このように、必要な部分だけを指定して日時を作成することもできます。指定しなかった部分は、月と日は1、時・分・秒は0が使用されます。
日時の計算
Timeオブジェクトでは、日時の計算も行うことができます。例えば、現在の日時から1日後や1時間前を計算できます。
# 現在の日時current_time = Time.nowputs "現在の日時: #{current_time}"
# 1日後tomorrow = current_time + (24 * 60 * 60)  # 24時間 × 60分 × 60秒puts "1日後: #{tomorrow}"
# 1週間後next_week = current_time + (7 * 24 * 60 * 60)puts "1週間後: #{next_week}"
# 1時間前one_hour_ago = current_time - (60 * 60)puts "1時間前: #{one_hour_ago}"実行すると、以下のような結果が表示されます(実行時の日時により異なります)。
現在の日時: 2025-05-13 15:30:45 +09001日後: 2025-05-14 15:30:45 +09001週間後: 2025-05-20 15:30:45 +09001時間前: 2025-05-13 14:30:45 +0900Timeオブジェクトに秒数を加えたり引いたりすることで、未来や過去の日時を計算できます。時間の計算では、1日は86,400秒(24時間 × 60分 × 60秒)として計算します。
日付の比較
Timeオブジェクト同士は、比較演算子(<、>、==など)を使って比較することができます。これにより、どちらの日時が新しいか、古いかなどを判断できます。
# 現在の日時current_time = Time.now
# 過去の日時past_time = Time.new(2020, 1, 1)
# 未来の日時future_time = Time.new(2030, 1, 1)
puts "現在 > 過去: #{current_time > past_time}"  # trueputs "現在 < 未来: #{current_time < future_time}"  # trueputs "過去 == 未来: #{past_time == future_time}"  # false実行すると、以下のような結果が表示されます。
現在 > 過去: true現在 < 未来: true過去 == 未来: falseこのように、日時の大小関係を簡単に比較することができます。これを利用して、「締め切りを過ぎているか?」や「予約開始日になっているか?」などの判断ができます。
まとめ
本章では、Rubyにおける日付と時刻の基本的な扱い方について学びました。以下のポイントを理解できたことと思います。
- Time.nowメソッドで現在の日時を取得できる
- Timeオブジェクトから、年、月、日、時、分、秒などの情報を取り出すことができる
- strftimeメソッドを使って、日時を様々な形式でフォーマットできる
- Time.newメソッドで、特定の日時を作成できる
- Timeオブジェクトに秒数を加減することで、未来や過去の日時を計算できる
- Timeオブジェクト同士を比較することで、日時の前後関係を判断できる
日付や時刻は、多くのプログラムで重要な役割を果たします。特に、ユーザーに対して日時を表示する場合や、時間に依存した処理を行う場合には、今回学んだ知識が役立つでしょう。
また、より高度な日付操作が必要な場合は、Ruby標準ライブラリのDateクラスやDateTimeクラス、あるいは外部ライブラリを使うこともできますが、基本的な日時の扱いであれば、Timeクラスで十分対応できます。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。