7

日付を見てみましょう:

1.9.2p320 :008 > Date.today
 => Wed, 03 Oct 2012 
1.9.2p320 :009 > Time.now
 => 2012-10-03 22:32:55 -0400

さて、真夜中はいつですか?

1.9.2p320 :005 > Date.today.midnight
 => Wed, 03 Oct 2012 00:00:00 UTC +00:00 

理にかなっています。しかし、昨日はどうですか?

1.9.2p320 :006 > Date.yesterday.midnight
 => Wed, 03 Oct 2012 00:00:00 UTC +00:00 

うーん、それはまったく意味がありません。今日の深夜は昨日の深夜と同じですか?あなたは深刻になることはできません !

1.9.2p320 :026 > Date.today.midnight == Date.yesterday.midnight
 => true 
1.9.2p320 :033 > 1.day.ago.midnight == Date.yesterday.midnight
 => true 
1.9.2p320 :034 > 1.day.ago.midnight == Date.today.midnight
 => true 

ああ、あなたは真剣です。明日はどう?

1.9.2p320 :007 > Date.tomorrow.midnight
 => Fri, 05 Oct 2012 00:00:00 UTC +00:00 

今日の午前 0 時が 3 日の午前 0 時で、昨日の午前 0 時が 3 日の午前 0 時ですが、明日の午前 0 時が 5 日の午前 0 時だとしたら、4 日の午前 0 時はどこでしょうか?

ここにあります:

1.9.2p320 :010 > 0.days.ago
 => Thu, 04 Oct 2012 02:34:58 UTC +00:00 
1.9.2p320 :011 > 0.days.ago.midnight
 => Thu, 04 Oct 2012 00:00:00 UTC +00:00

でも今日は0日前じゃないどうやらそうではありません。

それは私ですか、それともこれは内部的に一貫していませんか? Date.today は 0.days.ago と同じであるべきだと私には思えます。

days.agoが実際に Time オブジェクトを使用していること、およびこれがタイム ゾーンの問題であることを理解しています。

1.9.2p320 :030 > Date.today
 => Wed, 03 Oct 2012 
1.9.2p320 :021 > Time.now
 => 2012-10-03 22:40:09 -0400 
1.9.2p320 :023 > 0.days.ago
 => Thu, 04 Oct 2012 02:40:22 UTC +00:00 
1.9.2p320 :022 > Time.zone.now
 => Thu, 04 Oct 2012 02:40:14 UTC +00:00 

しかし、これらが便利な関数であることを考えると、タイムゾーンの仮定をある便利な関数に投げ込み、別の便利な関数に投げ込まないことは一種の意味のようです。どちらも、すべてのアカウントで同じことを意味します。

それを脇に置いても、それは、Date.today.midnight == Date.yesterday.midnight非常に単純に、怒って吠えているという事実を説明していないようです.

これに噛まれたのは私が最初ではないことを知っているので、何が欠けているのでしょうか?

4

2 に答える 2

8

Rails はyesterday、 、tomorrow、およびmidnightoffなどの相対的な日付計算に基づいて、構成された: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/date/calculations.rbDate.currentを使用しようとします。 #L46Time.zone

は UTC に設定されているため、実際に UTC 時間に座っていない限り、コンピューターのクロック時間を使用するTime.zoneoff に基づく計算と同じ結果は得られません。Date.today

そのため、UTC との時差が午前 0 時までの時間よりも大きい場合、Date.yesterday実際Date.todayには同じ日付が返されます。

Rails のタイム ゾーンを設定するTime.zone = 'Eastern Time (US & Canada)'か、現在のタイム ゾーンを設定して、例を再試行してください。

于 2012-10-04T03:14:02.247 に答える
1

ロスタは犯人を特定しました。Time.now.to_date必要に応じて、タイム ゾーンを指定することで運が良くなる場合があります。

> Time.now.in_time_zone("Asia/Tokyo")
  => Thu, 04 Oct 2012 12:54:43 JST +09:00 
> Time.now.in_time_zone("Asia/Tokyo").to_date.midnight
 => Thu, 04 Oct 2012 00:00:00 JST +09:00 
Time.now.in_time_zone("Asia/Tokyo").to_date.yesterday.midnight
 => Wed, 03 Oct 2012 00:00:00 JST +09:00 

> Time.zone = "America/Los_Angeles"
 => "America/Los_Angeles" 
> Time.now.in_time_zone
 => Wed, 03 Oct 2012 20:55:35 PDT -07:00 

> Time.now.to_date # using the system time
 => Wed, 03 Oct 2012 
> Time.now.to_date.midnight
 => Wed, 03 Oct 2012 00:00:00 PDT -07:00 
> Time.now.to_date.yesterday.midnight
 => Tue, 02 Oct 2012 00:00:00 PDT -07:00 
于 2012-10-04T04:03:14.313 に答える