2013-04-01 18 views
3

我已經爲我的CakePHP應用程序構建了一個簡單的時區幫助程序,這裏使用了堆棧溢出的各種示例,這些示例將用戶區域保存在用戶記錄中。例如歐洲/倫敦。CakePHP的時區幫手

要查看幫手:http://pastebin.com/VGivwqHJ

當用戶登錄到應用程序,我救當他們登錄,這樣我可以顯示日誌列表給用戶出於安全原因的日期/時間。例如$ this-> user-> saveField('lastlogin',date('Y-m-d H:i:s'));

但是,該日期目前將拉服務器日期/時間。我怎樣才能利用用戶的時區來修改它?

我想:

$date = new DateTime(null, new DateTimeZone($user['User']['timezone']));

然後:$this->User->saveField('lastlogin', $date->date);,但我只是得到空...

但是,如果我調試$日我收到例如:

object(DateTime) { 
    date => '2013-04-01 15:22:32' 
    timezone_type => (int) 3 
    timezone => 'Europe/London' 
} 

1.)我做錯了什麼?我如何從對象中提取日期時間?

2.)這是處理這個問題的好方法嗎?因爲這意味着我必須用此片段替換所有date()調用以獲取用戶時間。因此,例如,如果在歐洲發佈了一些用戶在美國,而是因爲他們的本地時間用戶之後再使用它會顯示爲不同的

3)將不會在網站上的日期變得不匹配,可能看起來好像在美國之前。

我應該代替保存服務器時間,然後利用片段上方,以顯示其不同的用戶,所以所有的時間是相同的時區,但隨後相對於用戶的信息?

回答

2

我不確定您是否可以使用saveField()保存DateTime對象。你必須很可能將其轉換爲字符串中的CakePHP認爲是通用的格式:

$this->User->saveField('lastlogin', $date->format('Y-m-d H:i:s')) 

你原來的代碼可能觸發此通知:

Notice: Undefined property: DateTime::$date 

...因爲有一個在沒有date公共財產類DateTime

關於您的其他問題,正如您已經指出的那樣,您顯然無法比較屬於不同時區的當地時間,就像您無法將公里與里程進行比較一樣。如果您存儲本地時間,則還需要存儲時區,並且每次都進行轉換。因此,簡化日期的標準化並始終將它們存儲在同一時區(UTC或服務器的時區)並在顯示信息時執行轉換。這也更有意義,因爲作者的當地時間與其他人無關。

+0

很酷,修復了第一個問題。接下來的兩個問題有什麼想法? – Cameron

+0

@Cameron - 看我的編輯。 –