2012-04-18 5 views
27

RubyでDate.todayを呼び出すと、現在の日付が返されます。しかし、それは何のタイムゾーンですか?私はUTCを想定していますが、確かめたいと思います。 documentationはいずれの方法も示していません。Date.todayはUTCですか?

答えて

28

日付は時刻を表していないため、日付にはタイムゾーンがありません。言っ

用として、それは現在の日付の計算方法、のはthe code for 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"); 

それは、その後Dateオブジェクトを作成するために使用tmを使用することを進めます。 tmにはlocaltime()を使用してシステムのローカル時刻が設定されているため、Date.todayはUTCではなくシステムのローカル時刻を使用します。


あなたは、常にUTCに新しい同等のTimeオブジェクトを返すようにTime#getutcをUTCにその場でそれを変換、または任意のTimeTime#utcを使用することができます。その後、Time#to_dateに電話して、Dateを得ることができます。だから:some_time.getutc.to_date

あなたは(Railsの付属)ActiveSupport’s time zone supportを使用している場合、それはRubyの時間のコンストラクタから完全に分離され、それらには影響しないことに注意してください(すなわち、それがどのようにTime.nowまたはDate.today仕事を変更しません)。 ActiveSupport extensions to Timeも参照してください。

+0

ご清聴ありがとうございます。私は私の質問をするより良い方法は、 "どのようなタイムゾーンとDate.todayが翌日に戻ってくるのか?私は "今日の日付はUTC"にしたいと思っていますが、私は 'Time.now.zone.to_date'(Railsで)のようなことをする必要があります。 –

+0

'Time.zone.now.to_date'は、アプリケーションが設定されているタイムゾーンを使用します。特定のコードブロック(この場合はUTC)のタイムゾーンを設定する場合は、Time.use_zone( '[zone name]')を調べることをお勧めします。 –

+5

はい、ActiveSupportのタイムゾーン管理では、 'Date.current'に等しい' Time.current.to_date'に等しい 'Time.zone.now.to_date'を行うことができます。 –

10

日付のインスタンスは、天文学のユリウス日番号として表されます。 1日の端数部分はありません。ユリウス日はGMTとの関係ですが、技術的にはDateのインスタンスは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" 
+0

私が元の質問に尋ねた理由について、@ AndrewMarshallの答えに対する私のコメントを参照してください。基本的には、ローカルシステムのDate.todayがUTCのシステムのDate.todayと同じになるかどうかを調べようとしています。 –

+1

Andrew氏によると、Date.todayはUTCではなく現地時間から日付を生成します。 時刻に対応する日付をUTCで取得するには、Time.now.utc.to_dateを試してください。 –

+0

一部の国では、日付のタイムゾーンを無視しても問題はないことを指摘したいと思います。もしあなたがそれをすれば、ほとんどの仕事日。 (例えば、2月13日の午前10時は12日、2100 UTCと思われます)。 – Rich

47

あなたのレールのアプリケーションがタイムゾーンUTCで実行するように構成されている場合は、単にTime.zone.todayを使用ルビー

+3

受け入れられた答えよりもはるかに優れています。 2012年4月以降にこれが追加されたのだろうかと思います。 –

+2

これは役に立つ情報ですが、質問に答えられません。これは関連する質問に答えます。「現在のUTC時間の日付を取得するにはどうすればよいですか?」というポスターには、Date.todayがUTCであったかどうかが尋ねられ、utcで日付を取得する方法ではありません。 –

1

Time.now.utc.to_date

を使用して逃げることができますそれ以外の場合は、Time.now.utc.to_date

0

あなたは、設定されたタイムゾーンの現在の日付を取得するには

Date.current 

を使用することができます。

関連する問題