2011-10-28 15 views
3

我有一個網站,我爲美國西部的一個水療中心設置了約會,例如PST時間。我應該如何在服務器端存儲來自JS的時間戳,以便我可以可靠地將其轉換爲其他時區?

當用戶選擇了說一點,上午10:00 @二○一○年三月二十〇日即會從我的桌面上的客戶端,它使用EDT時間創建日期對象是:

時間戳: 13953.24億
UTC字符串:星期四2014年3月20日10:00:00 GMT-0400(EDT)

我需要存儲這在服務器端。目前,我路過的時間戳從JS通過XHR到PHP和除以1000:

AJAX網址:ajax.php時間戳= 13953.24億
PHP代碼:

$time = $_GET['timestamp']/1000; 

因爲我的默認時區是手動設置爲America/New_York,我的客戶端的時間是美國東部時間,他們是一致的,所以顯示的合法時間:

echo date('M d Y H:i:s', $time); // Mar 20 2014 10:00:00 

但最好我想我真的應該設置服務器端的日期時間至是美洲/洛杉磯。不過這將使echo date顯示錯誤的日期,因爲這將會是,而不是EDT了:

date_default_timezone_set('America/Los_Angeles'); 
Mar 20 2014 07:00:00 

如今,它已成爲7:00 AM當用戶最初選擇10: 00 AM,這很明顯會導致混亂......如果用戶選擇了10:00 AM,我需要它在上午10點。

我的另一個擔心是,如果用戶的客戶端時間不是EDT?與America/New_YorkAmerica/Los_Angeles不一致嗎?

我是否應該像在Javascript中保存UTC字符串.toUTCString然後以UTC來存儲時間,並將默認時區設置爲UTC,然後在需要顯示PST時間時將其轉換爲PST時間?

順便說,因爲我處理PHP < 5.3

+0

據我所知,同樣的時間戳(如果正確地確定)代表即時在任何時區的「瞬間」。如果您需要知道用戶輸入的時區來自 – millimoose

+0

如果您使用['.getTime()'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/getTime),那麼你不必擔心,因爲它已經是UTC時間戳了。那只是一個服務器端展示的東西。 – mario

+0

好的,但是服務器端的默認時區是什麼,然後爲了與用戶選擇的內容保持一致?將其設置爲UTC,然後將其轉換爲PST? –

回答

1

我做這個任命件事我不能用DateTimeZoneDateTime。它變得混亂。

我的解決方案是(如您所建議的)將所有內容存儲爲UTC,並在需要時將其轉換爲用戶的時區。

我做了主要的JS編碼與date.js:http://www.datejs.com/

從服務器轉換UTC日期爲本地用戶

var d = new Date(); 
var offset = d.getTimezoneOffset(); 
var hours = parseInt(offset/-60); 
var minutes = (offset % 60) * -1; 

appointment_date = Date.parse(utc_date).add({minutes: minutes, hours:hours}) 

當然UTC_DATE必須以正確的格式 - 但應該是很容易與DATE_FORMAT MySQL的函數。

我總是存儲UTC日期和用戶的版本,在數據庫中該日期 - 所以當我給他們發郵件,我沒有根據自己的TZ制定出計算

appointment_id utc_date   user_date 
1    2011-10-01 10:00 2011-10-01 16:00 

我確定你明白了。

希望這會有所幫助。

0

您應該始終將時間戳存儲在服務器上。您需要關心時區的唯一時間是通過首先調用date_default_timezone_set將日期輸入到字符串或從字符串中輸出日期,該日期是輸入日期(或將要輸出的日期)的時區

如果您需要在服務器上創建時間字符串(或解析),您需要找到客戶端時區偏移並相應地進行調整。

如果您在客戶端上顯示JS的時間,則會自動在當地時區顯示/輸入時間。沒有辦法告訴瀏覽器使用不同的時區。您只能使用本地時區(默認)或調用getUTCxxxx方法獲取GMT時間並自行調整(如果您知道要顯示的時區偏移量)。時間戳總是相同的,不管什麼時區。

真正的問題是當您需要考慮夏令時時。對於另一個問題,這是個大問題。

0

請記住,此建議僅通過Microsoft Web服務和生成的代理進行過測試,可能不適用於其他安排。

我發現日期時間值由JS在瀏覽器時區解釋。

在下面的示例中,boundsResult是Web方法調用的成功處理程序接收的數據集。 START和END是將服務器作爲UTC離開的日期時間值。

var offset_milliseconds = boundsResult[0].START.getTimezoneOffset() * 60000; 
var startTime = new Date(boundsResult[0].START.getTime() - offset_milliseconds); 
var endTime = new Date(boundsResult[0].END.getTime() - offset_milliseconds); 

此修復依賴於始終將服務器作爲UTC離開的值。這不是一個不合理的期望;通用的時間框架是應對多個客戶時區的唯一直接方式。存儲本地化值是在尋求麻煩。

無論出於何種原因,轉換的另一種方式似乎是自動的。

你可以用它像這樣:

function utcDate(date) { 
    return new Date(date.getTime() - 60000 * date.getTimezoneOffset()); 
} 

,然後將樣品看起來像這樣

var startTime = utcDate(boundsResult[0].START); 
var endTime = utcDate(boundsResult[0].END); 
相關問題