◆当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

WEBCAMP【マンツーマンサポート】1ヶ月短期集中でプログラミングを学ぶスクール
1ヶ月通い放題・メンター常駐の教室環境でプログラミングを学びたい方!
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
Tech Camp教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
WEBCAMP PRO転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアへ3ヶ月で転職する為のスクールです!
1月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
11月生は満員となっております。12月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

常に必要というわけではありませんが、プログラムを作る上で、日時を扱うことは少なくありません。特にビジネスで使用するプログラムであれば、必要な場合が多いことでしょう。

じつは、Rubyで日時を扱う方法は、とても簡単になっています。

ただし、いくつか決まり事がありますので、ひとつひとつ解説していきます。

timesが気になる人へ

最初に、本稿へtimesを検索してこられた人へ説明しておきます。

本稿は、日時(特に時間)を扱うTimeオブジェクトについて詳しく解説した記事です。

timesメソッドは繰り返しを行うメソッドですので、よく似ていますがまったく違うものになります。

よろしければ、timesメソッドを含む繰り返し用のメソッドを解説している記事「【Ruby入門説明書】upto/downtoについて解説」をご覧ください。納得いただけるものと思います。

時間を扱うTimeクラス

Rubyで時間を扱う方法は、いくつもありますが、なにより基本となるTimeクラスについて説明しましょう。

Timeクラスは、時間に関わる様々な機能を提供してくれるクラスですので、Timeクラスを使うだけで、時間の扱いがとてもシンプルになります。

クラスとは?(超かんたんな概要)

Timeクラスについて説明する前に、まず「クラス」とはなにかが分からない人もいるかもしれませんので、説明をしておきます。

クラスは、Rubyのようなオブジェクト指向言語の基本となるものですので、この機会に概要だけでも理解しておくことをおすすめします。

クラスというのは、オブジェクト(狭義にはインスタンスですが、ここでは割愛します)の型となるものです。

つまり、クラスをもとにしてオブジェクトが生成され、そのオブジェクトを使って様々な処理を行うことになるのです。

オブジェクトにはそのオブジェクト固有の値(プロパティ)を保持しており、その値を含めてオブジェクトに関連した処理を行うメソッドを持っています。
(※文字列の長さを取得するときに「str.length」としましたが、これは文字列オブジェクトが持っているlengthメソッドを使っているわけです)

また、あるクラスをもとに機能を拡張させたクラスを作ることができたり(継承)、機能を書き換えたり(オーバーロード)することが可能ですが、ここでは詳しく説明しません。

端的に説明すれば、クラスというのはオブジェクトの設計図と言えます。

ただの設計図ですから、すべての機能が分かりますが、実際になにかするときにはそこからもの(オブジェクト)を作らなければいけないわけですね。

例えば、本稿で説明するTimeオブジェクトは、以下のようにして生成します。

time00.rb

t = Time.new  # 生成したTimeオブジェクトをtに格納する(時間の初期値は現在の時刻)
puts t        # tが保持している時間を表示する

t = Time.now  # 現在時刻を初期値にしたTimeオブジェクトを生成してtに格納する(実質的にnewした場合と同じ)
puts t        # tが保持している時間を表示する

※なお、newというのは、一般的なオブジェクト生成メソッドで、ほぼすべてのクラスでオブジェクト生成時に使います。Timeクラスについてだけ言えば、上述のように現在日時が初期値として設定されますので、nowメソッドと同じ動きになります

(結果)

2018-07-19 19:47:11 +0900
2018-07-19 19:47:11 +0900

Timeオブジェクトでできること

では、実際にTimeオブジェクトでできることを紹介しましょう。

・特定の時間の設定
・年、月、日、時、分、秒などの、日時の各要素の取得や変更
・表示形式を指定した文字列での日時表示
・日時の加減算
・経過秒数の取得
・世界標準時との時差の取得

これらについて、以降に詳しく説明していきます。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー

時間を設定する(local,mktime,gm,utc,at)

time00.rbで紹介したTimeオブジェクトを生成する方法では、現在時刻を持ったTimeオブジェクトしか得られません。

そのため、当然ながら任意の日時のTimeオブジェクトを得られるメソッドが存在しています。

それが以下のメソッドたちです。

メソッド名 機能
local,mktime 年月日時分秒を設定した時間を保持したTimeオブジェクトを生成する
gm,utc 与えられた年月日時分を世界標準時としたTimeオブジェクトを生成
at すでにあるTimeオブジェクトと同じ時刻を持ったTimeオブジェクトを生成する

動かしてみよう

具体的なプログラムを作って、動作を確認しておきましょう。

time01.rb

puts Time.local(2020,7,24,9,30,30)  # 年月日時分秒を指定
puts Time.local(2020,7,24)          # 時分秒を省略すれば、すべて0が設定されます
puts Time.local(2020)               # 月日を省略すれば、1が設定されます
puts Time.gm(2020,7,24,9,30,30)     # 年月日時分秒は最初のものと同じですが、基準を示す表記が違います

olympic = Time.local(2020,8,9)
puts Time.at(olympic)               # すでに取得したTimeオブジェクトolympicと同じ時間を保持します

(結果)

2020-07-24 09:30:30 +0900
2020-07-24 00:00:00 +0900
2020-01-01 00:00:00 +0900
2020-07-24 09:30:30 UTC
2020-08-09 00:00:00 +0900

ぜひ、数値をいろいろと変更して、動きを理解しておいてください。

時間の各要素を取得する

常に年月日時分秒が必要な場合というのは、じつはあまりありません。そのため、一般的には、年月日時分秒から必要な要素だけを取得することになるでしょう。

Timeオブジェクトでは、それも簡単に行えます。

簡単ですので、直接プログラムコードを見て確認しましょう。

time03.rb

olympic = Time.local(2020,7,24,9,30,30)  # Timeオブジェクトを生成

puts olympic
puts olympic.year  # 年
puts olympic.month # 月
puts olympic.day   # 日
puts olympic.hour  # 時
puts olympic.min   # 分
puts olympic.sec   # 秒
puts olympic.wday  # 曜日を表す値(0-6)日曜日が0
puts olympic.zone  # タイムゾーン

(結果)

2020-07-24 09:30:30 +0900
2020
7
24
9
30
30
5
JST

曜日については日曜日を0とした0から6までの値になっています。

また、タイムゾーンは、gmメソッドを使ってTimeオブジェクトを生成すると、世界標準時(UTC)になります。ここでJSTとなっているのは、最初にlocalメソッドで生成しているためです。(PC環境に依存します)

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】

時間を表示する(strftimeとformat文字列)

時間を表示するとき、何もしなければtime01.rbの結果のように表示されます。しかし、この表示では都合が悪い場合も少なくありません。そのため、表示形式を適した形に変更できるメソッドも用意されています。

それが、strftimeメソッドです。

strftimeメソッドでは、以下の構文で任意の表示形式にした日時の文字列を取得することができます。

Timeオブジェクト.strftime(format文字列)

format文字列というのは、表示したい形式を指定する文字列で、その中に出力値と置き換えられる特殊文字を指定することで、任意の表示形式を設定できるものです。

特殊文字

strftimeメソッドで使用できる特殊文字を紹介しておきましょう。

特殊文字 置き換えられる値
%A 曜日の英語表記(Sunday, Monday, ...)
%a 曜日の省略表記(Sun, Mon, ...)
%B 月の英語表記(January, February, ...)
%b 月の省略表記(Jan, Feb, ...)
%c 日付と時刻("Sun Jan 1 2:34:56 2018")
%d 日[1-31]
%H 時(24時間制[00-23])
%h 時(12時間制[01-12])
%j その年の何日目か[001-366](うるう年は366まであります)
%M 分[00-59]
%m 月[01-12]
%p 午前午後(AM,PM)
%S 秒[00-60](うるう秒のため60が出力されることもあります)
%U その年の何週目か[00-53](週初めを日曜とした場合)
%W その年の何週目か[00-53](週初めを月曜とした場合)
%w 曜日を表す値[0-6](0が日曜日)
%X 時刻("12:34:56")
%x 日時("12/31/99")(月/日/西暦の下2桁)
%Y 西暦
%y 西暦の下2桁[00-99]
%Z タイムゾーンを示す略号("JST", ...)
%% %を表示したい場合に使う

format文字列の中にこれらの文字があると、決まった値に置き換えられた文字列として出力されます。

動かしてみよう

実際に動かして、strftimeメソッドとformat文字列の動きを確認します。

time03.rb

olympic = Time.local(2020,7,24,9,30,30)  # 年月日時分秒を指定
puts(olympic.strftime("オリンピックの開会式は%Y年%m月%d日に100%%決まりました。"))

(結果)

オリンピックの開会式は2020年07月24日に100%決まりました。

日時の加減算と比較

Timeオブジェクトを使えば、日時の加減算も行えますので、プログラム上で時間を進めたり戻したりということが行え、比較することも可能です。

time04.rb

olympic = Time.local(2020,7,24)
today = Time.now

puts today                      # 今日
puts today + (60 * 60 * 24 * 7) # 1週間後
puts today - (60 * 60 * 24 * 7) # 1週間前
if olympic > today then
  print("olympicの方が、todayよりも" , olympic - today, "秒未来です。")
end

(結果)

2018-07-20 18:45:37 +0900
2018-07-27 18:45:37 +0900
2018-07-13 18:45:37 +0900
olympicの方が、todayよりも63436462.368752755秒未来です。

加減算ができるのは、秒単位です。そのため、1週間の秒数を計算して加減しています。

なお、active_supportというライブラリーを導入することで、年単位や月単位の加減算も行うことができます。また、日付であればDateクラスを使うことで様々な日付計算を簡単に行うことができますが、本稿では割愛します。

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】

日時を取得する(strptime ,parse)

データベースの時刻データは文字列で構成されていることがほとんどのため、文字列から時間を取得するということも、少なくありません。その方法についても紹介しましょう。

文字列中の日時を取得するには、parseメソッドとstrptimeメソッドが便利です。

parse

まずは、parseメソッドです。

あれこれ説明するよりも実際に動かして確認してみましょう。直感的に文字列中の日時情報を取得することができます。

time05-1.rb

require "time"  # parse関係のメソッドを使うときに必要

puts Time.parse("2020-8-9 5:43:21")
puts Time.parse("2018/07/24 12:34:56")
puts Time.parse("2018/1/23 12") 
puts Time.parse("20200724 123456")
puts Time.parse("20200724123456")
puts Time.parse("2020/12-31 12:34:56")
#puts Time.parse("2018年07月24日09:30")

(結果)

2020-08-09 05:43:21 +0900
2018-07-24 12:34:56 +0900
2018-01-23 12:00:00 +0900
2020-07-24 12:34:56 +0900
2020-07-24 12:34:56 +0900
2020-12-31 12:34:56 +0900

parseだけでもいろいろな書式に対応しており、一般的なデータベースやウェブサービスでそのまま使えるでしょう。しかし、残念ながら最後のコメントアウトしている日本語表示の文字列は対応しておらず、エラーになってしまいます。

そんな場合に使用できるのが、strptimeメソッドです。

strptime

strptimeメソッドは、入力される文字列のformat文字列を指定してやることができ、それを使って文字列から日時を取得することができるのです。

time05-1.rbを修正して、日本語表示の文字列からTimeオブジェクトを取得しましょう。

time05-2.rb

require "time"  # parse関係のメソッドを使うときに必要

puts Time.parse("2020-8-9 5:43:21")
puts Time.parse("2018/07/24 12:34:56")
puts Time.parse("2018/1/23 12") 
puts Time.parse("20200724 123456")
puts Time.parse("20200724123456")
puts Time.parse("2020/12-31 12:34:56")
puts Time.strptime("2018年07月24日09:30","%Y年%m月%d日 %H:%M")  # strptimeメソッドに変更

(結果)

2020-08-09 05:43:21 +0900
2018-07-24 12:34:56 +0900
2018-01-23 12:00:00 +0900
2020-07-24 12:34:56 +0900
2020-07-24 12:34:56 +0900
2020-12-31 12:34:56 +0900

以上のように、parseとstrptimeメソッドがあれば、多くの文字列から日時情報を取得して、Timeオブジェクトを作ることができるでしょう。

 

unixtimeとは

unixtimeというのは、1970年1月1日0時0分から何秒経ったのかを表している数値で、ほとんどのシステムがこの数値から日時を作成しています。

ただし、現在では、unixtimeは内部処理でのみ使われることがほとんどで、表に現れることはほとんどありません。

表に現れることがないと言っても、Rubyもまたunixtimeから時間を作っており、その証拠に、to_iメソッドを使ってTimeオブジェクトを整数(Integer)に変換すると、unixtimeになるのです。

olympic = Time.local(2020,7,24)
puts olympic
puts olympic.to_i

(結果)

2020-07-24 00:00:00 +0900
1595516400

また、Timeクラスのatメソッドにunixtimeを渡すことで、Timeオブジェクトを生成することができます。

unixtime = 1595516400
puts Time.at(unixtime)

(結果)

2020-07-24 00:00:00 +0900

時間を使って制御する(timeout)

timeに関わる単語として、timeoutを調べて本稿へお越しの傾きに、簡単なTimeout処理を紹介しておきます。

詳細については、少し難易度が高くなりますので、プログラムコードだけ紹介させていただきます。

よく分からない状態でも、何らかの処理で一定時間以上かかる場合はエラーとして処理したいときには使えるでしょう。

time06.rb

require 'timeout'

t = 3  # タイマー設定(この時間以上かかったら、エラーになる)

begin
  timeout(t){
    # 時間がかかる処理
    for i in 0..10
      puts i * i
      sleep 1
    end
  }
rescue Timeout::Error
  # タイムアウトした場合の処理
  puts "Timeoutしました"
end

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】

まとめ

今回はTimeオブジェクトについて、一般的によく使われる機能を中心に紹介しました。

ほとんどの場合は、本稿の知識があれば、日時を扱うのに苦労することはないと思います。

もちろん、他にも便利機能がありますが、それらは必要なときに確認して使用することをおすすめします。もちろん、身近な人やプログラミングスクールの講師に聞くなどすれば、そのときに最適な手法を教えてもらえますので、それが一番の近道かもしれません。


・クラスはオブジェクトの設計図
・オブジェクトは値とメソッドを持っている
・timesは繰り返し。Timeとはまったく違う
・時間を取得、表示したければ、Timeオブジェクトを使う
・Timeオブジェクトは、表示形式を任意に設定して日時表示ができる(strftime)
・日時表示の形式はformat文字列で設定する
・Timeオブジェクトでは、秒単位の加減算や比較(未来の方が大きい)ができる
・文字列と日時は相互に変換できる(parse,strptime)
・Rubyは内部にunixtimeを持っており、そこから日時が生成されている

WebCampOnline プログラミングコースについて

WebCampでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

WebCampOnlineが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWebデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

おすすめの記事