web-dev-qa-db-ja.com

Date.todayはUTCですか?

Ruby=でDate.todayを呼び出すと、現在の日付が返されます。ただし、現在のタイムゾーンは何ですか?UTCを想定していますが、確認したいと思います。 ドキュメント どちらの方法でも述べていません。

34
Matt Huggins

TL; DR:_Date.today_は、システムのローカルタイムゾーンを使用します。 UTCである必要がある場合は、代わりにUTC時間から日付を取得します。 _Time.now.utc.to_date_。


日付は時間を表すものではないため、タイムゾーンはありません。

つまり、howは現在の日を計算するので、- Date.today_ )==からのこの抽出を見てみましょう:

_time_t t;
struct tm tm;
// ...
if (time(&t) == -1)
  rb_sys_fail("time");
if (!localtime_r(&t, &tm))
  rb_sys_fail("localtime");
_

次に、use tmを使用してDateオブジェクトを作成します。 tmには localtime() を使用したシステムのローカル時間が含まれているため、_Date.today_はUTCではなくシステムのローカル時間を使用します。


いつでも _Time#utc_ を使用してTimeをインプレースでUTCに変換できます。または _Time#getutc_ を使用して新しい同等のものを返すことができますUTCのTimeオブジェクト。次に、その上で _Time#to_date_ を呼び出してDateを取得できます。つまり:_some_time.getutc.to_date_。

ActiveSupportのタイムゾーンサポート (Railsに含まれている)を使用している場合、Rubyの時間コンストラクターから完全に分離されており、Rubyの時間コンストラクターに影響しない(つまり、_Time.now_または_Date.today_作業)。 ActiveSupport extensions to Time も参照してください。

39
Andrew Marshall

あなたは逃げることができます

Time.now.utc.to_date

rubyで

48
vipulnsward

日付のインスタンスは、天文ユリウス日番号として表されます。 1日の端数部分はありません。ユリウス日はGMTに相対的ですが、技術的には日付のインスタンスはGMTであると見なす必要があります-ほとんどの場合、それを無視してタイムゾーンがないものとして扱うことができます。タイムゾーンは、DateTimeまたはTimeに変換した場合にのみ気になります。

ActiveSupportの日付変換ツールを使用すると、現地時間とUTCのどちらを使用するかを指定できます。

例えば。:

>> t = Date.today.to_time
=> Wed Apr 18 00:00:00 -0400 2012
>> t.zone
=> "EDT"
>> t = Date.today.to_time(:utc)
=> Wed Apr 18 00:00:00 UTC 2012
>> t.zone
=> "UTC"
11
Rich Drummond

使用できます

Date.current

構成されたタイムゾーンの現在の日付を取得します。

2
Arnold Roa

RailsアプリケーションがタイムゾーンUTCで実行するように構成されている場合は、Time.zone.todayを使用します。それ以外の場合は、Time.now.utc.to_dateを使用して強制します。

2
bluehallu