2015-12-09 49 views
1

我有一個Perl Catalyst應用程序,它在MySQL數據庫中存儲了一些時間。時間類型是TIMESTAMP,並用NOW()初始化。使用Perl DBIx在運行時設置MySQL時區

當讀回它們似乎在數據庫默認時區中的時間。但是,當使用mysql shell我可以很容易地設置時區SET time_zone ='+03:00';並獲取我的時區的當地時間。

有沒有辦法在運行時在Catalyst或DBIx中設置這樣的時間?

我希望能夠爲不同的用戶支持不同的時區,因此僅更改數據庫的默認時區是不夠的。我也知道,在我從MySQL獲取數據後,我可以用Perl格式化時間,但是Catalyst,DBIx和Template Toolkit的自動化程度非常高,因此從數據庫中正確地獲取數據將會是如此之多更方便。

+2

所以,你想要的是檢索數據,並使其數據庫本身更改取決於您的參數的值。我認爲這不是一種好的做法,也許你應該考慮將時區與時間一起存儲並檢索這兩個字段,或者可以檢索日期差異,將實際時區調整與實際日期相加。 – ChatterOne

+0

我知道您的數據庫中有日期時間,並且您想在用戶的當地時區向用戶展示這些日期時間,這對每個單獨的用戶都是不同的。這是應該在視圖中完成的事情。您可以使DBIC將'TIMESTAMP'字段轉換爲DateTime對象並使用它們。也許在你的View類中引入一個自動過濾器,它總是被應用到這些過濾器中,並讓DateTime處理轉換。 – simbabque

+0

是的,理想情況下,我想設置時區,並且奇蹟般地爲我的用戶添加了對本地時區的支持。如果不是,我想我將不得不在模式結果或視圖中添加一個函數。這並不是那麼難,但是它需要在一個龐大而複雜的代碼庫中進行多次更改。 –

回答

2

我的一般建議是在您的應用程序中設置日期時間,而不是依賴於數據庫服務器的日期時間。如果您不需要知道日期時間設置的時區,則應將其存儲在UTC中。如果您以後需要知道時區,則需要使用支持此類數據庫的數據類型,如Oracle中的'timestamp with timezone'。

看到我的回答Formatting timestamp field for output in TemplateToolkit這似乎是你問的。