簡體   English   中英

我應該如何以可靠地用於轉換為其他時區的方式在服務器端存儲來自JS的時間戳?

[英]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_YorkAmerica/Los_Angeles不一致嗎?

我應該做一些事情,比如在Javascript中通過.toUTCString保存UTC字符串,然后以UTC格式存儲時間,並將默認時區設置為UTC,然后在需要顯示PST時間時將其轉換為PST時間?

順便說一句 ,我不能使用DateTimeZoneDateTime因為我正在處理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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM