2016-01-19 22 views
0

我想比較表中的日期/時間與當前時間,看看該項目是否已過期。我嘗試了很多組合,但似乎無法正確調整時區。我在東部標準時間。無法在導軌中正確使用日期/時間比較。時區問題。

create_table "admin_messages", force: :cascade do |t| 
    t.text  "message" 
    t.datetime "expires" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

其基本思想是我可以添加消息和過期日期並顯示尚未過期的消息。

application.rb 
    config.active_record.default_timezone = 'Eastern Time (US & Canada)' 
    config.time_zone = 'Eastern Time (US & Canada)' 
    end 

我試過了很多方法讓下面的if語句正常工作無濟於事。

helper_method :show_admin_messages 
    def show_admin_messages 
    $admin_message = '' 
    @admin_messages = AdminMessage.all 
    @admin_messages.each do |message| 
     if message.expires >= Time.now.in_time_zone("Eastern Time (US & Canada)") 

     $admin_message = $admin_message + message.message + "<br>" 
     end 
    end 
    end 

如果我嘗試Time.now一對夫婦的變化,我得到:

Time.now 2016-01-19 09:23:08 -0500 
Time.now.utc 2016-01-19 14:23:08 UTC 
Time.now.localtime 2016-01-19 09:23:08 -0500 
Time.now.in_time_zone("Eastern Time (US & Canada)") 2016-01-19 09:23:08 -0500 

我的問題是試圖找出的if語句的語法。

回答

2

你可以使用:

if message.expires.past? 
    ## it expired 
else 
    ## not yet 
end 
+0

完美的作品。 –

+0

說得太快。我多了一些工作,看起來應用程序認爲日期存儲在UTC。 –

1

首先,你幾乎肯定不希望設置config.active_record.default_timezone。缺省值是utc - 對於其他時區,您將遇到諸如DST之類的問題,因此顯示記錄按照錯誤的順序重新創建等等。

對於絕大多數應用程序,時區僅在向用戶呈現輸出或接收輸入時相關。過濾等過期行爲是過去還是現在並不取決於此:

message.expires <= Time.now 

會做到這一點。

事件更是

@admin_messages = AdminMessage.where('expires > ?', Time.now) 

,所以你只從數據庫中首先提取未到期的消息。

+0

我從application.rb中刪除了'config.active_record.default_timezone ='Eastern Time(US&Canada)''。我仍然有一個時區偏移量。我改成了你建議的@admin_messages = AdminMessage.where('expires>?',Time.now)''行。 如果我通過sql查看錶格,日期存儲爲'2016-01-19 12:51:00.000000'。我已經把它設置爲12:51,所以看起來是正確的。但是,看來ruby/rails會將其轉換爲UTC。 –

+0

我不太清楚你在說什麼。預期的行爲是,用戶的輸入在存儲在db之前轉換爲utc –

+0

我遇到的一個重大問題是我沒有重啓webrick服務器。一旦我這樣做,您的解決方案就可以工作。 –