[英]How should I store a timestamp coming from JS on the server-side in a way that I can reliably use to convert to other timezones?
我有一個網站,我在那里設置了一個位於美國西部的水療中心的預約,例如PST時間。
當用戶在2010年3月20日上午10:00選擇一個地點時,在桌面上使用EDT時間從客戶端創建的日期對象是:
時間戳:1395324000000
utc string:2014年3月20日星期四10:00:00 GMT-0400(美國東部時間)
我需要將它存儲在服務器端。 目前,我通過XHR將時間戳從JS傳遞給PHP並除以1000:
ajax url:ajax.php?timestamp = 1395324000000
php代碼:
$time = $_GET['timestamp'] / 1000;
由於我的默認時區是手動設置為America/New_York
,而我的客戶端時間是在EDT中,因此它們是一致的,因此會顯示正確的時間:
echo date('M d Y H:i:s', $time); // Mar 20 2014 10:00:00
但理想情況下我認為我應該將服務器端日期時間設置為America / Los_Angeles ..但是這會使echo date
顯示錯誤的日期,因為它將是PST
而不是EDT
:
date_default_timezone_set('America/Los_Angeles');
Mar 20 2014 07:00:00
它現在變成早上7點,當用戶最初選擇上午10點時,這顯然會引起混淆......如果用戶選擇上午10點,我需要它是上午10點。
我的另一個擔心是,如果用戶的客戶端時間不是EDT怎么辦? 它會與America/New_York
或America/Los_Angeles
不一致嗎?
我應該做一些事情,比如在Javascript中通過.toUTCString
保存UTC字符串,然后以UTC格式存儲時間,並將默認時區設置為UTC,然后在需要顯示PST時間時將其轉換為PST時間?
順便說一句 ,我不能使用DateTimeZone
或DateTime
因為我正在處理php <5.3
我做過這個約會的事情。 這讓人很困惑。
我的解決方案是(如您所建議的)將所有內容存儲為UTC,並在需要時將其轉換為用戶的時區。
我用date.js做了主要的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
我相信你明白了。
希望這可以幫助。
請記住,此建議僅通過Microsoft Web服務和生成的代理進行了測試,可能不適用於其他安排。
我發現JS在瀏覽器時區中解釋了datetime值。
在以下示例中,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);
您應始終將時間戳存儲在服務器上。 您需要關心時區的唯一時間是通過首先調用date_default_timezone_set和輸入日期的時區(或將要輸出)來輸入或輸出字符串中的日期
如果需要在服務器上創建時間字符串(或解析),則需要找到客戶端時區偏移量並相應地進行調整。
如果您在客戶端上使用JS顯示時間,則將在本地時區自動顯示/輸入時間。 沒有辦法告訴瀏覽器使用不同的時區。 您只能使用本地時區(默認)或調用getUTCxxxx
方法來獲取GMT時間並getUTCxxxx
調整(如果您知道要顯示的時區偏移)。 無論什么時區,時間戳始終相同。
真正的問題是你需要考慮夏令時。 對於另一個問題,這是一個很大的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.