2014-05-02 30 views
4

我需要使用類似的查詢
SELECT * FROM items WHERE to_char(created_at AT TIME ZONE 'RAILS_GIVEN_ZONE', 'DD/MM/YYYY') ILIKE '%5/02%'如何將Rails時區名稱映射到PostgreSQL?

其中RAILS_GIVEN_ZONE值應始終使用的時區從軌道4的應用程序(可以由用戶改變),而不是PG的timezone選項。

但問題是來自Rails和PG的時區並不完全一一對應。

使用偏移量(來自Time.zone.now.formatted_offset+10:00)不夠好,因爲在這種情況下,PG將無法正確處理夏令時。

所以問題是自動將Rails當前時區(Time.zone)映射到名爲時區的PostgreSQL的的最佳方式是什麼?

注:create_attimestamptz(存儲爲UTC,在任何區域需要顯示)

+0

」不夠好,因爲在這種情況下,PG將無法正確處理夏令時。「 - 你不是這個意思:因爲Rails沒有正確處理DST? (PG處理它就好了,帶有時間戳類型。) –

+0

@Denis no PG實際上無法從偏移量中理解夏令時,因爲偏移量通常有多個區域。閱讀http://www.postgresql.org/docs/9.1/static/datatype-datetime.html#DATATYPE-TIMEZONES –

+0

不回答該問題,但可能對該主題有意思的閱讀:http://stackoverflow.com/問題/ 9571392 /忽略-timezones-allagether-in-rails-and-postgresql –

回答

1

似乎有是在ActiveSupport::TimeZone定義的MAPPING常數,它包含了,除非我弄錯值,應全部由Postgres的支持:

http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

每文檔:

鍵是Rails的TimeZone名稱,值是TZInfo標識符。

如果你不想直接使用MAPPING不變,那裏面有一個find_tzinfo方法,這似乎返回TZInfo::TimezoneProxy

http://rubydoc.info/gems/tzinfo/TZInfo/TimezoneProxy

後者運動的identifier方法應該包含所需的字符串。 「

+0

非常感謝Denis de Bernardy!所以你在說可以寫'ActiveSupport :: TimeZone.find_tzinfo(Time.zone.name).identifier'來獲取應用默認時區的PostgreSQL標識符。哦,任何人都知道更簡潔的方法來做到這一點? – lucas

相關問題