2012-04-18 18 views

回答

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"); 

然後繼續使用使用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’s time zone support(包含在Rails中),請注意它與Ruby的時間構造函數完全分離,並且不會影響它們(即它不會改變Time.nowDate.today的工作方式)。另見ActiveSupport extensions to Time

+0

感謝您的澄清。我想更好的方法來問我的問題將「與Date.today返回第二天的哪個時區相結合?」我想如果我想要「UTC的今天日期」,我需要做一些類似'Time.now.zone.to_date'(在Rails中)。 – 2012-04-19 03:46:04

+0

'Time.zone.now.to_date'將使用應用程序配置的任何時區。如果你想設置特定代碼塊的時區,在這種情況下爲UTC,那麼值得研究'Time.use_zone('[zone name]')'。 – 2013-07-30 16:33:37

+5

是的,ActiveSupport的時區管理,你可以做'Time.zone.now.to_date',它等於'Time.current.to_date'等於'Date.current'。 – 2013-07-30 16:54:43

10

日期的一個實例被表示爲一個天文朱利安天數;它沒有一天的小數部分。雖然Julian Day與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相同。 – 2012-04-19 03:47:39

+1

正如Andrew所說,Date.today的確從當地時間生成了一個不是UTC的日期。 要獲取與UTC時間相對應的日期,請嘗試Time.now.utc.to_date – 2012-04-19 03:57:12

+0

我只想指出,雖然對於某些國家,忽略日期的時區可能有效,但在新西蘭,您會得到錯誤的日期如果你這樣做,大部分工作日。 (例如,2月13日上午10點,我認爲,12日的2100 UTC)。 – Rich 2017-02-14 03:33:46

47

您可以通過使用

Time.now.utc.to_date

在紅寶石

+3

比公認的答案好得多。我想知道這是自2012年4月以來增加的。 – 2015-04-28 02:19:39

+2

這是有用的信息,但它不回答這個問題。這回答了相關問題「我怎樣才能得到當前UTC時間的日期?」,海報問Date.today是否使用UTC,而不是如何使用utc獲取日期。 – 2015-11-23 19:49:03

1

如果你的Rails應用程序被配置爲在時區UTC運行,那麼只要使用Time.zone.today脫身,否則強制使用Time.now.utc.to_date

0

您可以使用

Date.current 

要獲得關於配置的時區當前的日期。