Rubyにおける、日付や時刻の基本と操作を解説します。
他言語と同じように、Rubyにもやはり日付や時刻を簡単に扱える仕組みが用意されています。
この記事を読み終わる頃には、日付や時刻の操作が思い通りにできるようになっているでしょう。
特に、海外からアクセスされるWebシステムを開発される方、必見です!
目次
まず最初は時間の基本 UTCなど
まず最初はRubyを忘れて、時間の基本を確認しましょう。
世界の国々の現在時間は異なっている、つまり時差があるのは今さらいうまでもありません。
日本の時間を基準にして世界各国の時間を考えると、いろいろと問題がでてきます。
例えばお隣の中国とは1時間の時差、つまり日本が1時間進んでいます。ドイツと日本は7時間、つまり日本が7時間進んでいます。ですが、中国とドイツは、その他の国とは・・・と考え始めるとだんだんとややこしくなります。
世界各国が自分の標準時間で物事を語り始めると、さらに複雑です。
今や多国籍企業はめずらしい存在ではありません。大企業でなくても海外とやり取りのある、または海外に支店を置く企業は多数あります。システムは日本に設置、各国からデータを書き込みに来る、というケースもあるでしょう。
このような場合、各国から同じデータベースに自国の標準時にて書き込みを始めると、収集がつかなくなります。世界で統一された時間の基準が欲しくなります。
それが、協定世界時(UTC)と呼ばれるものです。
UTCを基準として、その協定世界時から見て何時間進んでいるかを表現することにより、国ごとの標準時をいうことができます。
日本は協定世界時から9時間の進み、つまり「UTC +9:00」、中国は「UTC +8:00」なので日本より1時間遅れ、と時差をその国の標準時を知るまでもなく計算できるのは便利ですよね。
また、UTCと同じようにGMT(グリニッジ標準時)というものもあり、同じく「日本はGMT +9:00」と表現できます。
最近はUTCが広く使われています。本記事でも、一貫してUTCを基準に解説します。
Rubyにおける日付や時刻 Time/Date
Rubyでは、日付と時刻はそれぞれDateクラス、Timeクラスを使って操作します。
Dateクラスは年月日だけを扱います。Timeクラスは年月日時分秒を扱います。一見してTimeクラスさえあれば事足りるような気がしますがそうではありません。
Dateクラスは、来月の同日や月末日の計算ができるという得意技があります。
現在時刻を表示 Time.now
TimeやDateを使い、現在の日付や時刻を取得してみましょう。
puts Time.now
[実行結果]
2017-10-08 23:04:14 +0900
Time.nowによってTimeオブジェクトが得られます。その結果を表示させています。
表示時刻を書式変更 strftime
Time.nowのもつ標準書式ではなく、それ以外の書式で表示させたい場合は、strftimeを使います。ただし、得られる結果は文字列であることを注意してください。
[書式]
t.strftime(書式)
書式の部分は、ココをご覧ください。
いくつかサンプル的に試してみましょう。
t = Time.now puts t.strftime("%Y/%m/%d %H:%M:%S %z")
日付の部分をスラッシュ区切りに変えてみました。
書式は比較的自由に設定できます。年月日だけ欲しい場合は、
t = Time.now puts t.strftime("%Y/%m/%d")
とすれば、
[実行結果]
2017/10/08
が得られます。
時刻を「作る」 mktime
mktimeを使い、年月日時分秒を「自分で作る」ことも可能です。mktimeに引数を渡します。
[書式]
Time.mktime[年, 月, 日, 時, 分, 秒, 秒の端数]
[使用例]
t = Time.mktime(2018,10,9,4,41,00) puts t
[実行結果]
2018-10-09 04:41:00 +0900
規格に則ったフォーマット iso8501/rfc2822
時間の表現には、何らかの規格に沿ったものもあります。
iso8601
国際標準であるiso8601です。
require "time" t = Time.now puts t.iso8601
[実行結果]
2017-10-09T05:00:09+09:00
rfc2822
メールヘッダにある日時の規格であるrfc2822です。同じようにTimeオブジェクトを生成してから、そのオブジェクトの持つ時刻を書式に則って取得します。
require "time" t = Time.now puts t.rfc2822
[実行結果]
Mon, 09 Oct 2017 05:02:35 +0900
UTCを取得する
国をまたいだ時間の管理をする場合、UTC +0:00が欲しくなります。その場合、いったんTimeオブジェクトを取得し、UTCに直します。
t = Time.now puts t.utc
[実行結果]
2017-10-08 20:06:18 UTC
日付を計算する
Timeオブジェクトは、比較や減算が可能です。
t1 = Time.now sleep 2 t2 = Time.now puts t2 - t1 puts t2 > t1
[実行結果]
2.005284 true
時間オブジェクトを生成し、そのあと2秒間おいて別のオブジェクトを生成します。そして2つのオブジェクトを引き算するだけで経過時間を取得できました。
比較演算子を使って比較できることも確認できました。
月末日を取得する
どの言語でも苦労する、しかも、とても頻繁に出てくる「月末日を取得する」をやってみましょう。Dateクラスを使って簡単にできます。
require 'date' d = Date.today puts Date.new(d.year,d.month,-1) puts Date.new(2017, 9, -1)
[実行結果]
2017-10-31 2017-09-30
1行目のputsは、実行時の月末日を取得します。2行目のputsは、任意の年月の月末日を取得できることを表しています。
まとめ
本記事では、Rubyにおける日付と時刻の基本を解説しました。
日付や時刻の扱い方を習得し、ログデータの収集や、国際間の日付や時刻の管理などにぜひお役立てください。