2017-06-03 26 views
0

基本的に私はSQLクエリでdatetime + interval(将来は何か)の行を挿入します。JavaScriptのカウントダウンとタイムゾーン

$interval = new DateInterval('PT'.$H.'H'.$i.'M'.$s.'S'); 
    $date = new DateTime(); $date->add($interval); 
    $query = $conn->prepare("INSERT INTO profiles_in_missions (id_pim, id_profile, id_mission, time) VALUES (NULL, :idprofile, :idmission,:time)"); 
    $query->bindValue(':idprofile', $tableau[0]); 
    $query->bindValue(':idmission', $id); 
    $query->bindValue(':time', $date->format('Y-m-d H:i:s')); 
    $query->execute(); 

私のPCが表示されている場合:23時40分に、と私は+ 8minutesの間隔で日時を挿入すると、このクエリは、データベース内の21:48を格納します。今まで大丈夫、私のデータベースはGTM + 00で、私のPCのデフォルトブラウザはGTM + 2です。

一度格納されると、(この場合)-2h + 8mを得たこの日付を選んでカウントダウンします。

今問題:カウントダウンを行うには、私はjavascriptを使用しています。私は21:48-now()を実行します。しかし、彼はいつも2時間早く通常よりも終了します。なぜなら、GTM + 00のMYSQLの保存日(21:48)はJavascript now()ですからです。デフォルトのブラウザ時間GTM + 2を取得しています。

JavascriptをサーバーTimezone GTM + 00と連携させる方法はありますか?どうすれば問題を解決できますか?カウントダウンのためにすべての私のコードがあります:

<script> 

var t = document.getElementById('myInputTimer').value; 
var countDownDate = new Date(t).getTime(); 

// Update the count down every 1 second 
var x = setInterval(function() { 

    // Get todays date and time 
    var now = new Date().getTime(); 

    // Find the distance between now an the count down date 
    var distance = countDownDate - now; 

    // Time calculations for days, hours, minutes and seconds 
    var hours = Math.floor((distance % (1000 * 60 * 60 * 24))/(1000 * 60 * 60)); 
    var minutes = Math.floor((distance % (1000 * 60 * 60))/(1000 * 60)); 
    var seconds = Math.floor((distance % (1000 * 60))/1000); 

    // Display the result in the element with id="demo" 
    document.getElementById("demo").innerHTML = hours + "h " 
    + minutes + "m " + seconds + "s "; 

    // If the count down is finished, write some text 
    if (distance < 0) { 
    clearInterval(x); 
    document.getElementById("demo").innerHTML = "EXPIRED"; 
    } 
}, 1000); 
</script> 

答えて

0

new Date().getTime()Date.now()に置き換えることができる)単に日付ゼロからのミリ秒数を返します。文字列を使用すると、任意のタイムゾーン情報が含まれていない日付オブジェクトを作成するために使用している場合は、それがブラウザのタイムゾーンを想定してい

var t = document.getElementById('myInputTimer').value; 
var countDownDate = new Date(t).getTime(); 

:タイムゾーンは、タイムゾーンの要因はここにあるとなり、ここでの要因ではありません。
私はこの文字列がUTC時刻の日付であると仮定していますか?

一つの解決策は、それは次のようになりますを意味し、この文字列はタイムゾーン情報が含まれていることを確認することです:2017-06-03T22:23:00+00:00

別の解決策日付を解析されてきた後にタイムゾーンのオフセットを補正するためです。 new Date("2017-06-03 22:23:00")はあなたに午後08時23分であるSat Jun 03 2017 22:23:00 GMT+0200 (CEST)を与えるのであれば、あなたはタイムゾーンオフセットを減算して、それを修正することができます。

var countDownDate = new Date(t).getTime() - (new Date().getTimezoneOffset() * 60 * 1000); 

.getTimezoneOffset()を分単位でタイムゾーンのオフセットを返し、我々はそれがどのように多くのミリ秒単位で計算して、ミリ秒からそれを差し引きます.getTime()

文字列を使用して日付を作成することは、実装に依存していて信頼性が低いため、最適ではありません。さまざまなコンポーネント(年、月、日、時間など)を解析し、それらのコンポーネントを使用して日付を作成する方がよいでしょう。

var dateParts = t.match(/\d+/g); 

そして最良の部分は、今あなたが直接、UTCの時刻を取得するために Date.UTC()の代わり new Date(t).getTime()を使用することができるということです:あなたはこのような要素を解析するために正規表現を使用することができます

var countDownDate = Date.UTC.apply(null, dateParts); 
+0

**私はちょうど今あなたにキスしたい!**ありがとうございました。あなたはそのアンサーと過ごす時間のために本当にありがとう。彼は100%働いた –

関連する問題