• WebCamp_インタビュー
    「1カ月頑張ればこの先が見えてくる」地元メディアを立ち上げたママさん
    2017.07.20
  • WebCamp_インタビュー
    【卒業生インタビュー】台湾で月間100万UUの訪日旅行メディアを手掛けるCEOが、プログラミングを学んで得たものとは?
    2018.01.15
  • WebCamp_インタビュー
    【WebCamp受講生インタビュー】起業準備中にCEOが気がついたプログラミングスキルの重要性とは?
    2017.12.25
  • WebCamp_インタビュー
    【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
    2018.01.15
  • WebCamp_インタビュー
    “未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
    2017.10.04
  • WebCampPro_インタビュー
    未経験から上京し、エンジニアとしてチームラボグループに転職!【WebCampPro卒業生インタビュー】
    2018.03.10
  • WebCamp_インタビュー
    「自信の持てるスキルを得たい!」内定辞退した女子大生がプログラミングを学習したワケ。
    2018.04.28
  • WebCamp_インタビュー
    時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
    2018.01.26
  • WebCampPro_インタビュー
    未経験でも寿司職人からWebデザイナーになった!ホスピタリティでスクールを支える宮脇トレーナー
    2017.05.26
  • WebCampPro_インタビュー
    未経験31歳からエンジニア転職を実現【実際に聞いてみた】
    2017.04.01
  • WebCampPro_インタビュー
    自分で稼ぐ力をつけるため、新卒5年目の営業マンがエンジニアに転職!【WebCampPro転職者インタビュー】
    2018.02.02

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

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

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

じつは、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』受講者インタビュー
2017-10-04 10:26
今回の記事では、未経験からWebCampを1ヶ月受講し、その後エンジニアとして転職をした喜田さんにお話を伺いました。 <プロフィール> 喜田 大介 さん (28歳) 大学時代はプ...

時間を設定する(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卒業生インタビュー】
2018-03-22 23:28
今回の記事では、独学でPHPを1年半学習し、その後WebCampを受講して未経験からエンジニアへと転職された佐々木さんにお話を伺いました。 <プロフィール> 佐々木 祐樹 さん(2...

時間を表示する(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卒業生インタビュー】
2018-01-26 13:03
今回の記事では、WebCampに1ヶ月間通い、未経験からエンジニアとして転職した星野さんにお話を伺いました。 <プロフィール> 星野 智洋 さん(25) 学生時代は日本大学芸術学部...

">

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
2018-01-26 13:03
今回の記事では、WebCampに1ヶ月間通い、未経験からエンジニアとして転職した星野さんにお話を伺いました。 <プロフィール> 星野 智洋 さん(25) 学生時代は日本大学芸術学部...

日時を取得する(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を持っており、そこから日時が生成されている

WebCamp・WebCamp Proについて

WebCampは1ヶ月でプログラミング・Webデザインスキルを学ぶ通い放題のプログラミングスクールです。WebCamp Proは3ヶ月間で未経験から即戦力エンジニアを育成するプログラミングスクールです。

2つのサービスを運営するインフラトップでは、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。

キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?

8月枠も残りわずか当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
7月受入枠は満員となっております。8月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

▼未経験から1ヶ月でWebデザイン・プログラミングを学びたい方はこちら!

▼ついに開講!オンラインでWebデザインを学びたい方はこちら!

 

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

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

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

転職のサポートがほしい

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

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
2018-01-15 13:23
今回の記事では、WebCampで1ヶ月間Rubyを学習し、Webエンジニアとして転職した卒業生の田中さんにお話を伺いました。 <プロフィール> 田中 デニス 昭彦さん(...
関連キーワード
Rubyの関連記事
  • 【Ruby入門説明書】クラスの継承について解説
  • 【Ruby入門説明書】インスタンスと変数について説明
  • 【Ruby入門説明書】メソッドの基本から応用までの全体像、一覧表について解説
  • 【Ruby入門説明書】クラスの定義について解説
  • 【Ruby入門説明書】ハッシュについて解説
  • 【Ruby入門説明書】arrayについて解説

当サイトで人気のオススメ転職サービスTOP3

1位 マイナビエージェント×IT

おすすめポイント

・平日忙しい人も、土曜日開催の個別キャリア相談会に参加できる

・職種や仕事内容(要件定義、上流工程から携わる仕事など)の要望が細かくできる
・マイナビの規模を活かした豊富で幅広い求人数

マイナビエージェント×ITの登録はこちら

2位 レバテックキャリア

おすすめポイント

・求人登録数4,000件以上

・エンジニア未経験、経験者両方に対応

・有名企業の採用担当者インタビューがみれる

・一次面接NGからの内定実績もあるほど、内定率が高い

レバテックキャリアの登録はこちら

 3位 type転職エージェント

おすすめポイント

転職者の71%が年収アップ

・IT系企業、特にエンジニアに限らず営業職の求人も充実している

各職種専門の転職アドバイザーが援助

type転職エージェントの登録はこちら