[PHP] countdown 6 ore data

Alex1990000

Nuovo Utente
26 Lug 2017
9
0
1
34
buonasera a tutti,
avrei un quesito riguardo la differenza tra due date, il perché se faccio quest0 calcolo :
PHP:
$date=date('Y-m-d H:i:s');
$faultdate = $row["datacreazione"];
                $difference =$date - $faultdate;
                $num = $difference/86400;
                $days = intval($num);
                $num2 = ($num - $days)*24;
                $hours = intval($num2);
                $num3 = ($num2 - $hours)*60;
                $mins = intval($num3);
                $num4 = ($num3 - $mins)*60;
                $secs = intval($num4);
        echo $faultdate;
        echo $hours.'hours';

Invece di restituite un tempo mi fornisce sempre 0 ore. Le date nelle variabili sono correttamente visualizzabili: 1) al db registrata tramite form 2) data restituita dal server.

Cod. Completo con modifica:

PHP:
<?php
    include 'connection.php';
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    

    $sql = "SELECT  * FROM faultmetroweb";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
    // output data of each row
        while($row = $result->fetch_assoc()) {
            $ft = $row["datacreazione"];
            $ft = new DateTime($ft);
            $lt = new DateTime();
            $dd = ( $lt->getTimestamp() - $ft->getTimestamp() ) / 3600;

            echo $lt->format('Y-m-d H:i:s')." Local DateTime corrente <br /><br />";
            echo $dd." differenza in ore <br /><br />";

                
        echo '<!DOCTYPE html>';
        echo '<html>';
        echo '<head>';
        echo '<style>*{margin:0px; padding:0px; text-align:center;}body{background-color:#d0e4fe;}h4{color:orange;text-align:center;}p{font-family:"Times New Roman";font-size:15px;}table{width:1100px;}td{width:100px;}</style>';
        echo '</head>';
        echo '<body>';
        echo '<table>';
        echo '<tr>';
        echo '<td><h4>ID</h4></td>';
        echo '<td><h4>ID Richiesta</h4></td>';
        echo '<td><h4>Codice Comunicazione Olo</h4></td>';
        echo '<td><h4>System</h4></td>';
        echo '<td><h4>Stato Attuale</h4></td>';
        echo '<td><h4>ID Risorsa</h4></td>';
        echo '<td><h4>Cliente</h4></td>';
        echo '<td><h4>Flag Individuazione Guasto</h4></td>';
        echo '<td><h4>Comune</h4></td>';
        echo '<td><h4>GPON ID</h4></td>';
        echo '<td><h4>Data Creazione</h4></td>';
        echo '<td><h4>Tempo Di Lavorazione</h4></td>';
        echo '</tr>';
        echo '<tr>';
        echo '<td>'. $row["id"].'</td>';
        echo '<td>'. $row["idrichiesta"].'</td>';
        echo '<td>'. $row["codicecomunicazioneolo"].'</td>';
        echo '<td>'. $row["system"].'</td>';
        echo '<td>'. $row["statoattuale"].'</td>';
        echo '<td>'. $row["idrisorsa"].'</td>';
        echo '<td>'. $row["cliente"].'</td>';
        echo '<td>'. $row["flagindividuazioneguasto"].'</td>';
        echo '<td>'. $row["comune"].'</td>';
        echo '<td>'. $row["gponid"].'</td>';
        echo '<td>'. $row["datacreazione"].'</td>';
        echo '<td>'. $dd.' Ore</td>';
        echo '</tr>';
        echo '</table>';
        echo '</body>';
        echo '</html>';
        }
    } else {
        echo "0 risultati";
}
    
    
    
    
$conn->close();
?>
 
Ultima modifica:
$date e $faultdate sono delle stringhe, perciò non puoi effettuare direttamente la sottrazione.
Per trasformare $faultdate in timestamp puoi usare la funzione strtotime, mentre per il timestamp attuale puoi semplicemente usare time(), senza bisogno di definire la variabile $date.

PHP:
$faultdate = $row["datacreazione"];
                $difference = time() - strtotime($faultdate);
                $num = $difference/86400;
                $days = intval($num);
                $num2 = ($num - $days)*24;
                $hours = intval($num2);
                $num3 = ($num2 - $hours)*60;
                $mins = intval($num3);
                $num4 = ($num3 - $mins)*60;
                $secs = intval($num4);
        echo $faultdate;
        echo $hours.'hours';
 
trovato nel vostro forum, grandissimi.
PHP:
$dt = '2017-07-24 19:27:13';

$dt = new DateTime($dt);
$lt = new DateTime();

$dd = ( $lt->getTimestamp() - $dt->getTimestamp() ) / 3600;

echo $dt->format('Y-m-d H:i:s')." DateTime di partenza <br />";
echo $lt->format('Y-m-d H:i:s')." Local DateTime corrente <br /><br />";
echo $dd." differenza in ore <br /><br />";

if ($dd > 1) echo "Pratica non modificabile <br /><br />";
else         echo "ok alle modifiche <br /><br />";

però avrei un altra domanda se io devo impostare più date all'interno dello script ad esempio:

io inserisco una data fa la differenza, ma al momento che io inserisco una sospensione me la blocca è continua dalla data di desospensione è possibile?
 
$date e $faultdate sono delle stringhe, perciò non puoi effettuare direttamente la sottrazione.
Per trasformare $faultdate in timestamp puoi usare la funzione strtotime, mentre per il timestamp attuale puoi semplicemente usare time(), senza bisogno di definire la variabile $date.
giustamente però mi conviene inviarti tutto il codice nel post. Lo modifico subito, perché quella è una data all'interno del DB
 
$date e $faultdate sono delle stringhe, perciò non puoi effettuare direttamente la sottrazione.
oltre a quanto detto da @livellacri che ho citato,
c'è qualche imprecisione di calcolo nelle formule che hai postato, ho corretto, verifica
poi guarda in fondo all'esempio, c'è un metodo più veloce per ottenere il risultato
PHP:
<?php
$faultdate = '2017-07-23 19:27:13';

$dt = new DateTime($faultdate);
$lt = new DateTime();

echo $lt->format('Y-m-d H:i:s')." current local DateTime<br />";
echo $faultdate." data di creazione (faultdate)<br /><br />";

    $num   = (int) ( $lt->getTimestamp() - $dt->getTimestamp() );

    echo "date diff : ".$num."<br />";

    $days  = intval($num / 86400);
    echo "days      : ".$days."<br />";

    $num   = $num - $days * 86400 ;
    echo "resto     : ".$num."<br />";

    $hours = intval($num / 3600);
    echo "hours     : ".$hours."<br />";

    $num   = $num - $hours * 3600;
    echo "resto     : ".$num."<br />";

    $mins  = intval($num / 60);
    echo "mins      : ".$mins."<br />";

    $secs  = intval($num - $mins * 60);
    echo "secs      : ".$secs."<br /><br />";

echo sprintf("%02d days %02d hours %02d minutes %02d seconds", $days, $hours, $mins, $secs)."<br /><br />";

$interval = $lt->diff($dt);
echo $interval->format("%a days %h hours %i minutes %s seconds")."<br /><br />";
?>

relativo riultato,
2017-07-26 23:07:49 current local DateTime
2017-07-23 19:27:13 data di creazione (faultdate)

date diff : 272436
days : 3
resto : 13236
hours : 3
resto : 2436
mins : 40
secs : 36

03 days 03 hours 40 minutes 36 seconds

3 days 3 hours 40 minutes 36 seconds
 
Ultima modifica:
però avrei un altra domanda se io devo impostare più date all'interno dello script ad esempio:

io inserisco una data fa la differenza, ma al momento che io inserisco una sospensione me la blocca è continua dalla data di desospensione è possibile?
pensiero "ermetico" (non vuoi farti capire ! :)) puoi spiegare meglio ?
 
attenzione al valore del time locale piuttosto che UTC ...
dal manuale
Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).
ancora,
The documentation should have this info. The function time() returns always timestamp that is timezone independent (=UTC).
 
pensiero "ermetico" (non vuoi farti capire ! :)) puoi spiegare meglio ?
nono assolutamente ;), vi ringrazio dell'aiuto. Ora vi spiego in parole povere cosa devo fare:

Il pannello in questione serve per visualizzare, tutti i guasti nell'arco della giornata con un tempo massimo di 6 ore e un avviso di ogni 2 ore o 3 in base al tipo guasto.
I dati dei guasti risiedono nel database di cui vorrei da web la possibilità di cancellare e aggiornare i guasti per riga riga è eventualmente delle data di sospensione e de-sospensione che rientrino nelle 6 ore cumulative.

Un pò complicato lo ammetto ma già che funziona è tanto ;)...

attenzione al valore del time locale piuttosto che UTC ...
dal manuale
Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).
ancora,
The documentation should have this info. The function time() returns always timestamp that is timezone independent (=UTC).

gmdate("Y-m-d\TH:i:s\Z"); ?

ma cosi riesco a togliere la frazione di secondo che non mi serve :D
 
gmdate("Y-m-d\TH:i:s\Z"); ?
ma cosi riesco a togliere la frazione di secondo che non mi serve :D
si certo, ho solo avvertito che restituisce il valore GMT o UTC che dir si voglia,
poi come è fatta la tua applicazione lo sai tu, io non ho idea di come sia stata memorizzata la data nel db, se però fai la differenza tra una data/ora locale ed una GMT,
nasce un problema ......

Il pannello in questione
credo sia una applicazione specifica, forse ti conviene aprire una nuova discussione per trovare chi è disponibile ad aiutarti
 
la cella dei tempi è impostata su DATETIME, pero più che altro non riesco a capire come inserire degli intervalli nelle 6 ore :(.

forse ci sono riuscito, tra un pò posto il codice.
 
Ultima modifica:

Discussioni simili