このエントリーをはてなブックマークに追加

2016年12月8日木曜日

はじめの一歩 -Rails 時間・タイムゾーン編- その2

どうも、はじめです。

前回は指定したフォーマットで時刻を表示する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 件のコメント:

コメントを投稿