Bir PHP / MySQL / JavaScript sisteminde zaman farkı hesaplanırken

6 Cevap php

Ben en iyi yolu, en geri sayım süresini diyelim, artık belli bir noktaya zaman içinde farkı hesaplamak için ne olduğunu merak ediyordum.

Ben belirli bir noktada bir closetime olan bir müzayede var, bu sefer format "DATETIME 00-00-000 00:00:00" bir MySQL kaydında saklanır. Bu kayıt closetime denir.

Şimdi, benim web sitesinde bir PHP dosyası ile bu zaman alır JavaScript kodu var. JavaScript her saniye setInterval 1000 kullanarak döngüler. PHP dosyası db closetime alır, ve bu biçimde geri gönderir

strtotime($result['closetime']);

Ve ben istek zaman olsun, ben kullanıcının saat kapalı olabilir, çünkü JavaScript zaman sunucu zamanı kullanmak, değil istiyorum.

strtotime(date("H:i:s", $_SERVER['REQUEST_TIME']))

Ben bu iki damgaları geri göndermek ve JavaScript aralarındaki zaman farkını hesaplamak. Ben bu açık olması gerektiğini düşünüyorum, değerleri ben CurrentTime ve closeTime çağrı geri PHP göndermek, bunu yapmak için bu işlevi kullanın.

function auctionDelayTime(currentTime,closeTime){
    totaldelay = closeTime - currentTime;
    if(totaldelay <= 0){
        return 'ended';
    }else{
        if( days=parseInt((Math.floor(totaldelay/86400))) )
            totaldelay = totaldelay % 86400;
        if( hours=parseInt((Math.floor(totaldelay/3600))) )
            totaldelay = totaldelay % 3600;
      if( minutes=parseInt((Math.floor(totaldelay/60))) )
            totaldelay = totaldelay % 60;
        if( seconds=parseInt((Math.floor(totaldelay/1))) )
            totaldelay = totaldelay % 1;

        return hours+':'+formatTimes(minutes)+':'+formatTimes(seconds);
    }
}
function formatTimes(value){
    return value < 10 ? '0'+value : value;
}

Bu kod bir çok şey o kadar basit bir şey yapmak olduğunu düşünüyorum. Herkes daha iyi bir çözüm ya da belki daha 'güzel' bir kod var mı.

Tadını çıkarın!

6 Cevap

Kullan Date object.

var d = new Date(difference_in_milliseconds);
var seconds = d.getSeconds();
var minutes = d.getMinutes();
var hours = d.getHours() - 1; //See note

Not: Garip, saat değer ben anlamıyorum nedenle umduğunuzdan daha biri tarafından büyük. Bu 1:00 :-) oldu "gece yarısı 1 Ocak 1970" gibi görünüyor

GÜNCELLEME: 1 farkı benim timezone (GMT +1) ofset kaynaklanmaktadır.

Bu çözecek hafif bir değişiklik:

var d = new Date();
var offset = d.getTimezoneOffset() * 60000;
var d = new Date(difference_in_milliseconds + offset);
var seconds = d.getSeconds();
var minutes = d.getMinutes();
var hours = d.getHours();

Php de bu şekilde yapabilirsiniz:

$time_period = ( $tEnd - $tStart );
$time_increments = array( 'days' => 86400, 'hrs' => 3600, 'mins' => 60, 's' => 1 );

## will hold our values for ( day, minute, hour, seconds )
$time_span = array();

## cycle through time_increments
while( list( $key, $value ) = each( $time_increments )) {
   $this_value = (int) ( $time_period / $value );
   $time_period = ( $time_period % $value );

   # save value
   $time_span[$key] = $this_value;
 }

 ## show results
 while( list( $key, $value ) = each( $time_span )) {
    print "$value $key ";
 }

Josef gibi EDIT söyledi:

 $tEnd = mktime(14,15,00,1,7,2009);
 $tStart = mktime(15,10,00,12,5,2006);
 $time_period = ( $tEnd - $tStart );

 echo date("z H:i:s", $time_period); 

sonuç: 33 '23: 05:00 ': S

AJAX ile bir jquery Countdown Plugin destekler sunucu senkronizasyon vardır:

Kimden docs:

Synchronise the client's time with that of the server by providing a function that returns the current server date and time. This date and time should take into account the server's timezone and any difference between that time and the client's is applied to the countdown when it is started or changed.

The following example uses a PHP program on the server to return the current server time in a format that can be used directly by the JavaScript callback. You should make sure that your server call is synchronous.

$(selector).countdown({ 
    until:liftoffTime, serverSync: serverTime}); 

function serverTime() { 
    var time = null; 
    $.ajax({url: 'http://myserver.com/serverTime.php', 
        async: false, dataType: 'text', 
        success: function(text) { 
            time = new Date(text); 
        }, error: function(http, message, exc) { 
            time = new Date(); 
    }}); 
    return time; 
}

serverTime.php:

<?php 
$now = new DateTime(); 
echo $now->format("M j, Y H:i:s O")."\n"; 
?>

Bu JavaScript library kullanımı kolaydır ve büyük olasılıkla size de hizmet verecek.

Neden php sayfası, farkı vermek değil?

$sql = "SELECT UNIX_TIMESTAMP(NOW()) as currentTime, UNIX_TIMESTAMP(closeTime) as closeTime FROM yourTable WHERE yourRecordId = '123'";

$query = mysql_query($sql);

$result = mysql_fetch_assoc($query);

echo timeRemaining($result['currentTime'], $result['closeTime']);

function timeRemaining($start, $end) {
    $dateDiff = $end - $start;
    if ($dateDiff <= 0) { return 'Ended'; }
    $fullDays = floor($dateDiff/(60*60*24));
    $fullHours = floor(($dateDiff-($fullDays*60*60*24))/(60*60));
    $fullMinutes = floor(($dateDiff-($fullDays*60*60*24)-($fullHours*60*60))/60);
    return "Ending in $fullDays days, $fullHours hours and $fullMinutes minutes.";   
}

Do you really have to get the time through AJAX every 1000 ms? (i suppose that you're hoping for closetime changes? ...)

Eğer gerçekten bu şekilde yapmak gerekir, ama, ben kod basitlik için MySQL doğrudan zaman farkını almak öneririz.

$sql = "SELECT TIMEDIFF(NOW(), `CreateTime`) from `Table` WHERE `id`=1;"