前回は指定したフォーマットで時刻を表示するstrftimeについて書いてみました。
「はじめの一歩 -Rails 時間・タイムゾーン編-」
今回は日付や時間に関するクラスである
こちらの4つについて書いていきます。
「Time、Date、DateTime、TimeWithZone」
はじめに、
現在時刻の取得をした後、strftime()で「年月日、時刻、曜日、タイムゾーン」を表示してそれぞれの違いを見ていきます。
Time
こちらはRubyで用意されている時刻を表すクラスです。現在時刻の取得、表示はこのように行います。
time = Time.now
# => 2016-12-07 21:28:39 +0900
time.strftime('%Y * %m * %d * %w * %U * %X * %Z')
# => "2016 * 12 * 07 * 3 * 49 * 21:28:39 * JST"
年月日、時分秒、曜日、タイムゾーンなどの情報を表示することができました。Date
こちらはRubyで用意されている日付を表すクラスです。使用する際は
require ‘date’
と記述をする必要があります。現在時刻の取得、表示はこのように行います。
require ‘date'
date = Date.today
date.strftime('%Y * %m * %d * %w * %U * %X * %Z')
# => "2016 * 12 * 07 * 3 * 49 * 00:00:00 * +00:00"
Timeとは違って年月日、曜日のみ表示されました。その他の時分秒、タイムゾーンの情報は全て0で表示されています。
DateTime
こちらは日付と時刻を扱えるDateのサブクラスです。DateTimeもDateクラスと同様に使用する際には
require ‘date’
と記述する必要があります。現在時刻の取得、表示はこのように行います。
requrire ‘date’
datetime = DateTime.now
datetime.strftime('%Y * %m * %d * %w * %U * %X * %Z')
# => "2016 * 12 * 07 * 3 * 49 * 21:28:39 * +09:00”
Timeクラスと同じように年月日、時分秒、曜日の情報が表示されましたが、タイムゾーンに関しては表示が違います。
Timeクラスでは”JST"と文字列で表示されていますが、
DateTimeクラスの場合は”+09:00”とUTC(協定世界時)からの時差が表示されています。
TimeWithZone
こちらはRailsで使用することができるActiveSupport::TimeWithZoneクラスです。素のRubyでは使用することはできません。
TimeWithZoneクラスでの現在時刻の取得、表示は以下のようになります。
timewithzone = Time.zone.now
timewithzone.strftime('%Y * %m * %d * %w * %U * %X * %Z’)
# => "2016 * 12 * 07 * 3 * 49 * 21:28:39 * JST”
こちらはTimeクラスと全く同じ表示になりました。まとめ
Time、DateTime、TimeWithZoneの3つに関しては、大きな違いはないように見えます。
調べてみたところTime、DateTimeの違いとしては以下の点があげられるようです。
Timeの場合、
・require無しで使える
・タイムゾーンの指定なしでインスタンスの生成を行った時、システムまたは環境変数で設定しているタイムゾーンが使用される
(DateTimeの場合はUTCが使用される)
・うるう秒を使える
・サマータイムを使える
ということからDateTimeよりTimeを使用したほうが良いとのことです。
Timeに対してTimeWithZoneはシステムや環境変数ではなく、
application.rbに設定したタイムゾーンが使用されるようです。
また、"Time.current"でタイムゾーンを指定して時刻の取得を行うこともできます。
つまり。。。
Time、DateTime、TimeWithZoneの全てが使える環境であれば、タイムゾーンを柔軟に扱えるTimeWithZoneを使用し、
そうでない環境である場合はTimeを使用する形になるのではないかと思います。
次回
前回から今回にかけて現在時刻を取得して比較をしていましたが、次回は翌日や翌年、時刻の指定やUnixTimeの変換等について
書いてみようと思います。
0 件のコメント:
コメントを投稿