1

我有一個應用程序使用許多不同的時區...它將它們設置在一個控制器中,它們根據用戶而變化。所有的時間都存儲在UTC沒有時間戳等處理rails + postgres和時區

我的理解是這是Rails處理時區的正常方式。這工作正常99%的時間,直到我需要直接與Postgres做一些事情,然後時區成爲一個問題。

例如這個查詢除了GMT完全錯誤的,例如在中部時區,根據不同的時間設定的,它得到了錯誤的一天:

Events.where("EXTRACT(dow FROM start_at)", Date.today.wday) 

當我試圖找到所有的日期在某一天。

我想要做這樣的事情。我不需要在時區之間進行搜索(它們不會混雜在一起),但如果時區不是UTC,則需要指定時區以獲得正確的結果。

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", 'UTC', Date.today.wday) 

但我不知道如何使用Time.zone給我的東西,將與時區Postgres的工作。

Time.zone.tzinfo有時作品... Postgres將與「歐洲/華沙」的工作,但Rails的回報「歐洲 - 華沙​​」

一般來說我並沒有多少運氣與時區,任何指針將不勝感激。

回答

3

也許別人有更好的整體解決方案,但你需要對特定的查詢是什麼

Time.zone.tzinfo.identifier 

或者,在你的榜樣:

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", Time.zone.tzinfo.identifier, Date.today.wday) 
1

嘗試直接使用Ruby TZInfo寶石,而不是使用Rails ActiveSupport::TimeZone

或者,使用MAPPING常數,如ActiveSupport::TimeZone文檔中所示,該文檔將使您從Rails時區密鑰返回到由Postgres和其他人使用的標準IANA時區標識符。

0

正如馬特約翰遜建議直接使用TZInfo寶石。通過這種方式,您可以獲得需要使用PostgreSQL查詢的格式正確的時區標識符。

例如,如果你使用:

TZInfo::Timezone.all_country_zone_identifiers 

這將返回正確的IANA /奧爾森時區標識符數組。換句話說,你會得到正確的'歐洲/華沙'而不是'歐洲 - 華沙​​'。