2012-04-07 41 views
4

我正在參與活動網站。我從本地主機上的MySQL數據庫獲取UTC時間,並使用PHP將它們回顯到頁面,然後使用Javascript將它們轉換爲用戶的時區。出於某種原因,Javascript給我的時間比我從MySQL獲得的時間晚了兩個小時。我和我的服務器都在Mountain Standard Timezone中,所以Javascript應該將日期推回六個小時,但是日期會延後八個小時。即使夏令時僅相差一小時,而不是兩小時。Javascript日期對象未針對時區偏移進行適當調整

下面是使用Javascript用於平移PHP時間戳的日期對象和YYYY-MM-DD HH輸出它:II:ss格式(用了jQuery):

function leadingzeros(string){ 
    if (string.toString().length == 1){ 
     string = "0" + string; 
    } 
    return string; 
} 

$(document).ready(function(){ 
    var thisdate = new Date(<?php echo (strtotime($row['start'])*1000);?>); 
    $("#jsdate").html(
     thisdate.getFullYear()+"-"+leadingzeros((thisdate.getMonth()+1))+"-"+ leadingzeros(thisdate.getDate())+" "+ 
     leadingzeros(thisdate.getHours())+":"+leadingzeros(thisdate.getMinutes())+":"+leadingzeros(thisdate.getSeconds()) 
    ); 
}); 

下面是文檔正文中的PHP :

<?php 
$row = mysqli_fetch_assoc($result); 
echo "<ul><li>MySQL datetime object: ".$row['start']."</li>". 
"<li>PHP Unix timestamp: ".strtotime($row['start'])."</li>". 
"<li>PHP date string: ".date("Y-m-d H:i:s",strtotime($row['start']))."</li>". 
"<li>PHP date minus 6 hours (which is our timezone offset): ".date("Y-m-d H:i:s",strtotime($row['start']) - (6*3600))."</li>". 
"<li>Javascript date: <span id='jsdate'></span></li></ul>"; 
?> 

它輸出:

  • MySQL的日期時間對象:2012-04-07二十三點00分00秒
  • PHP Unix時間戳:1333832400
  • PHP日期字符串:2012-04-07 23:00:00
  • PHP日期減去6小時(這是我們的時區偏移量):2012-04-07 17:00:00
  • javascript日期:2012-04-07 15:00:00

我讀過的文件中沒有得到答案。爲什麼Javascript日期在MST的PHP日期後兩個小時?

+0

是你的服務器時間和客戶機時間一樣嗎?如果是的話,時區也是一樣的? – nandu 2012-04-07 19:09:10

+0

試試這裏:http://jsfiddle.net/wQMTu/ - 你看到了什麼? – Alexander 2012-04-07 19:46:04

+0

不是答案,但這可能有所幫助:我建議您以UTC存儲和傳輸時間值,並且只有在他們將顯示給用戶時,將其轉換爲本地時間。如果你這樣做,那麼無論你的服務器是MST還是你的瀏覽器是(其他任何東西)都沒關係。它可以幫助消除一大類錯誤。它可以使重新託管更簡單。等等。 – Cheeso 2012-04-07 19:51:09

回答

0

發生這種情況的原因是因爲strtotime()在分析給定日期/時間時默認使用date.timezone設置,所以結果得到相應補償。

要解決這個問題,你可以設置date.timezoneEtc/UTC或「錨」從你的數據庫中的時間戳,像這樣:

strtotime("{$row['start']} GMT") 
0

我只是提醒在使用此代碼的js的日期。

var thisdate = new Date(<?php echo (strtotime('2012-04-07 23:00:00')*1000);?>); 
    alert(thisdate); 
    alert(<?php echo (strtotime('2012-04-07 23:00:00')*1000);?>); 

什麼,我得到的是 enter image description here

所以u得到的時間相對於格林尼治標準時間。在PHP和MySQL服務器必須配置時間zone.so你不擔心。