連載
» 2014年07月29日 18時00分 公開

RubyのNumericとTimeで数値と時間をさまざまな操作・演算・判定若手エンジニア/初心者のためのRuby 2.1入門(6)(4/4 ページ)

[著:麻田優真、監修:山根剛司,株式会社アジャイルウェア]
前のページへ 1|2|3|4       

時刻を表現するためのTimeクラス

 Timeクラスは、時刻を表現するためのクラスです。Timeクラスを使うことで、時差の計算や曜日の取得などが簡単にできます。Timeオブジェクトはローカル時刻と協定世界時刻を内部で区別しています。

補足「Timeクラスの拡張」

 RailsではTimeクラスの拡張や、さらに高機能なDateTimeといったクラスを利用できます。本記事の趣旨と外れてしまいますので、ここでは割愛しますが、Railsの一部であるActiveSupportを導入すれば、非Railsのプロジェクトでもこれらの拡張を利用できます。


現在の時刻を取得するnowメソッド

 Time.nowメソッドを使うことで、現在時刻を取得できます。このメソッドの実行結果は実行する時刻に依存するので、実際には以下の結果と異なる返り値が得られるでしょう。

[1] pry(main)> Time.now
=> 2014-04-18 21:21:13 +0900

 このように、Timeクラスのオブジェクトには、日付・時刻・協定世界時刻との時差の情報が含まれています。

Timeオブジェクトを生成する

 Time.newメソッドを使うことで、引数で指定した時刻を持ったTimeオブジェクトを生成できます。

[1] pry(main)> local_time = Time.new(2014, 4, 18, 5, 30, 0, "+09:00")
=> 2014-04-18 05:30:00 +0900

 ここで生成されるTimeオブジェクトはローカル時刻となり、最後の引数は協定世界時刻との時差を示す文字列です。

 協定世界時刻を表すTimeオブジェクトを生成する場合は、Time.utcメソッドを使います。別名として、Time.gmメソッドを使うこともできます。

[2] pry(main)> utc_time = Time.utc(2014, 4, 18, 5, 30, 0)
=> 2014-04-18 05:30:00 UTC

 Timeオブジェクトが協定世界時刻であるかどうかは、Time#gmt?もしくはTime#utc?を使って取得できます。

[3] pry(main)> local_time.utc?
=> false
[4] pry(main)> utc_time.utc?
=> true

 変数local_timeはローカル時刻なので、[3]の実行結果はfalseとなっています。対する変数utc_timeは協定世界時刻なので、[4]の実行結果はtrueとなっています。

時刻に含まれる各種情報を取り出す

年月日・時刻の取得

 Timeオブジェクトから年月日などの情報を得る例を以下に示します。

[1] pry(main)> local_time = Time.new(2014, 4, 18, 5, 30, 0, "+09:00")
=> 2014-04-18 05:30:00 +0900
[2] pry(main)> local_time.year
=> 2014
[3] pry(main)> local_time.month
=> 4
[4] pry(main)> local_time.day
=> 18
[5] pry(main)> local_time.hour
=> 5
[6] pry(main)> local_time.min
=> 30
[7] pry(main)> local_time.sec
=> 0
[8] pry(main)> local_time.yday
=> 108
[9] pry(main)> local_time.dst?
=> false
[10] pry(main)> local_time.utc_offset
=> 32400  
[11] pry(main)> local_time.to_a
=> [0, 30, 5, 18, 4, 2014, 5, 108, false, nil]

 [1]でローカル時刻を持つTimeオブジェクトを生成し、変数local_timeに格納しています。[2]ではTime#yearで年を、[3]ではTime#monthで月を、[4]ではTime#dayで日付を取得しています。[6]以降は時刻に関する情報で、Time#hourで時刻を、[7]ではTime#minで分を、[8]ではTime#secで秒数を取得しています。

 また、[8]は年内通算日(その年が始まってから何日目か)を表しており、[9]はサマータイムかどうか、[10]は協定世界時刻との時差を秒数で表したものです。

 各種情報をまとめて得たい場合は、[11]のようにTime#to_aを使うと各種情報を配列で得ることができます。108の部分は年内通算日、falseの部分はサマータイムかどうかを表しており、nilの部分はタイムゾーンを表しています。

曜日の取得

 曜日の取得にはいくつかの方法があります。以下は「XX曜日かどうか」を取得する例です。

[11] pry(main)> local_time.sunday?
=> false
[12] pry(main)> local_time.monday?
=> false
[13] pry(main)> local_time.tuesday?
=> false
[14] pry(main)> local_time.wednesday?
=> false
[15] pry(main)> local_time.thursday?
=> false
[16] pry(main)> local_time.friday?
=> true
[17] pry(main)> local_time.saturday?
=> false

 local_timeの表している2014年4月18日は金曜日であるため、Time#friday?のみがtrueになっています。

 また、以下のようにTime#wdayを使うと、曜日を整数の形で取得することができます。

[18] pry(main)> local_time.wday
=> 5

 Time#wdayでは、日曜日を0、月曜日を1、火曜日を2、水曜日を3、木曜日を4、金曜日を5、土曜日を6という整数で得ることができます。local_timeの表している2014年4月18日は金曜日であるため、ここでは5という整数が返り値として返っています。

Rubyにおける基本的な時刻の演算

 「+」演算子を使うと、指定した秒数だけ時刻を進めたTimeオブジェクトを得ることができます。以下はその例です。

[1] pry(main)> time = Time.new(2014, 4, 18, 5, 30, 0, "+09:00")
=> 2014-04-18 05:30:00 +0900
[2] pry(main)> time + 3600
=> 2014-04-18 06:30:00 +0900

[1]で2014年4月18日 5:30:00を表すTimeオブジェクトを生成し、変数timeに格納しています。[2]では「+」演算子によって、timeより3600秒進めた時刻、つまり1時間後のTimeオブジェクトを生成しています。

 「-」演算子を使うと、指定した秒数だけ時刻を巻き戻したTimeオブジェクトを得ることができます。

[3] pry(main)> time - 3600
=> 2014-04-18 04:30:00 +0900

 [3]では、timeより3600秒前の時刻、つまり1時間前のTimeオブジェクトを生成しています。

時刻の比較

 整数などのオブジェクトと同様、Timeオブジェクトも比較演算子を用いた比較ができ、if文などの条件として用いることができます。以下に時刻の比較の例をいくつか示します。

[1] pry(main)> past = Time.new(2014, 4, 18, 5, 30, 0, "+09:00")
=> 2014-04-18 05:30:00 +0900
[2] pry(main)> future = Time.new(2014, 4, 18, 8, 30, 0, "+09:00")
=> 2014-04-18 08:30:00 +0900
[3] pry(main)> past > future
=> false
[4] pry(main)> past < future
=> true
[5] pry(main)> past <=> future
=> -1
[6] pry(main)> future <=> past
=> 1
[7] pry(main)> past <=> past
=> 0

 [1]で変数pastに「2014年4月18日 5:30:00」を表すTimeオブジェクトを代入し、[2]で変数futureに「2014年4月18日 8:30:00」を表すTimeオブジェクトを代入しています。

 [3][4]では「>」演算子や「<」演算子を用いて時刻の比較を行っています。未来を表す時刻の方が大きいとされるため、[3]の結果はfalseに、[4]の結果はtrueになります。また、[5]、[6]、[7]では宇宙船演算子を使って比較を行っています。

次回は、オブジェクト指向を支える概念、モジュールとクラスについて

 今回は、Rubyの組み込みデータクラスの最終回ということで、数値を表現するNumericクラスと時刻を表現するTimeクラスについて解説しました。

 Numericクラスについて、さらに詳しく知りたい場合は、Numericのリファレンスマニュアルが参考になります。またTimeについて、さらに詳しく知りたい場合は、Timeのリファレンスマニュアルが参考になります。

 次回はRubyの特徴であるオブジェクト指向を支える概念、モジュールとクラスについて解説します。お楽しみに!

著者プロフィール

麻田 優真(Rails技術者認定シルバー試験問題作成者)

イタリア、ローマ生まれ。中学生のころHSPに初めて触れ、プログラミングの楽しさを知る。オープンソースやハッカーカルチャーを好む。C#からRubyに転向したときに、動的型付け言語の柔軟性やメタプログラミングの魅力に感動し、Rubyとともにプログラマーとしての人生を歩む決意を固める。

現在は奈良先端科学技術大学院大学で学生として所属するかたわら、株式会社アジャイルウェアでプログラマーとして従事。Ruby on Railsによるコンシューマー向けのWebサービスの開発などに尽力している。

好きなメソッドは、define_method。

Twitter:@Mozamimy、ブログ:http://blog.quellencode.org/


監修者プロフィール

山根 剛司(Ruby業務開発歴7年)

兵庫県生まれ。1997年からベンチャー系のパッケージベンダーで10年間勤務。当時、使用していた言語はJavaとサーバーサイドJavaScript。

2007年よりITコンサル会社に転職し、Rubyと出会って衝撃を受ける。基幹システムをRuby on Railsで置き換えるプロジェクトに従事。それ以来Ruby一筋で、Ruby on Railsのプラグインやgemも開発。

2013年より、株式会社アジャイルウェアに所属。アジャイルな手法で、Ruby on Railsを使って企業向けシステムを構築する業務に従事。

Ruby関西所属。

Twitter:@spring_kuma、Facebook:山根 剛司


前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。