[Javascript] Trasformare secondi a giorni, ore, minuti

  • Creatore Discussione Creatore Discussione vasomik
  • Data di inizio Data di inizio

vasomik

Nuovo Utente
14 Mar 2017
31
0
6
Ciao a tutti ho il seguente problema:

devo trasformare dei secondi in ore, giorni e minuti partendo da due date.
Le date in questione sono:
19/02/2017 ore 7.44 (millisecondi 1487486640000)
31/03/2017 ore 4.23 (millisecondi 1490926980000)

Inizialmente le trasformo in millisecondi, che ho indicato sopra, li divido per mille per avere i secondi, da qui faccio la differenza tra i secondi per ottenere l'intervallo in secondi tra le date.

L'intervallo in secondi risulta essere: 3440340.

Da questo punto uso questo codice per ottenere i giorni, le ore, i minuti, ecc.
Codice:
giorni = Math.floor(intervallo / 86400);
secondi_resto = intervallo - (giorni * 86400);
ore = Math.floor(secondi_resto / 3600);
secondi_resto = intervallo - (giorni * 86400) - (ore * 3600);
minuti = Math.floor(secondi_resto / 60);
secondi_resto = intervallo - (giorni * 86400) - (ore * 3600) - (minuti * 60);

Da questo codice ottengo i seguenti risultati:

giorni: 39 ore: 19 minuti: 39

il calcolo che faccio io mi da un risultato differente e cioè:

giorni: 39 ore: 20 minuti: 39

Qualcuno sa aiutarmi?

vasomik
 
Ultima modifica:
Ciao, non ho capito molto.
A parte che la differenza tra i 2 time che hai postato non fa 3990340 ma 3440340, il calcolo che ti da un minuto in più come lo fai ?
 
Ciao, non ho capito molto.
A parte che la differenza tra i 2 time che hai postato non fa 3990340 ma 3440340
Grazie per la risposta.
Ho digitato male il numero della differenza, è giusto il numero che hai scritto tu, lo correggo nel primo messaggio per chiarezza.

il calcolo che ti da un minuto in più come lo fai ?

Il calcolo che faccio io, con il quale ottengo un'ora in più è così:

1) dalle 7,44 alla mezzanotte del 19/2/2017 ci sono 16h 16m
2) conto i giorni interi dal 20/2/2017 al 30/3/2017 che sono 39
3) dalla mezzanotte del 31/03 alle 4,23 ci sono 4h 23m

a questo punto sommo le 16h 16m con 4h 23m, totale 20h 39m

Quindi 39 giorni 20 ore 39 minuti

vasomik
 
alle 4,23 si intende 4:23:00 secondi
il ventitreesimo minuto non è ancora iniziato quindi ne devi contare 22
ps
a no aspetta sto dicendo una cavolata fammi ragionare :)
 
al 28 marzo abbiamo tirato avanti gli orologi di un'ora per via dell'ora legale e anche se ora non riesco a fare un ragionamento intelligente penso che la differenza sia dovuta a questo, quindi è giusto lo script che tiene conto di quell'ora persa.
 
al 28 marzo abbiamo tirato avanti gli orologi di un'ora per via dell'ora legale e anche se ora non riesco a fare un ragionamento intelligente penso che la differenza sia dovuta a questo, quindi è giusto lo script che tiene conto di quell'ora persa.
Ho fatto delle prove, hi ragione tu, tutto é dovuto all'ora legale/solare.

1) 19/2 dalle 7,44 - 10/3 alle 4,23 il risultato é 18 gg 20 h 39 m
2) 19/2 dalle 7,44 - 26/3 alle 4,23 il risultato é 34 gg 20 h 39 m
3) 19/2 dalle 7,44 - 27/3 alle 4,23 il risultato é 35 gg 19 h 39 m
4) 19/2 dalle 7,44 - 28/3 alle 4,23 il risultato é 36 gg 19 h 39 m

5) 19/9 dalle 7,44 - 29/10 alle 4,23 il risultato é 39 gg 20 h 39 m
6) 19/9 dalle 7,44 - 30/10 alle 4,23 il risultato é 40 gg 21 h 39 m

Il discorso, come si vede dall'esempio, si verifica anche al ritorno dell'ora solare, fissata per il 29/10 alle 2.00.

Come posso gestire questa cosa?
 
ma è strano, non mi viene in mente niente
con php il conto torna
PHP:
<?php

$data1 = new DateTime("2017-02-19 07:44:00");
$data2 = new DateTime("2017-03-26 04:23:00");
$diff = $data1->diff($data2);
echo $diff->days . " giorni " . $diff->h . " ore " . $diff->i . " minuti<br/>";

$data1 = new DateTime("2017-02-19 07:44:00");
$data2 = new DateTime("2017-03-27 04:23:00");
$diff = $data1->diff($data2);
echo $diff->days . " giorni " . $diff->h . " ore " . $diff->i . " minuti<br/>";
 
l'oggetto Date di javascript restituisce l'ora GMT
la funzione getTimezoneOffset() dovrebbe restituire la differenza tra l'ora locale e l'ora di Greenwich, forse si può sfruttare.
in effetti io non mi ero mai posto il problema
fai qualche prova con l'aiuto della console
Codice:
var time = new Date(2017, 1, 19, 7, 44, 0);
    console.log(time);
    console.log(time.getTime());
    console.log(time.getTimezoneOffset());
var time2 = new Date(2017, 2, 31, 4, 23, 0);
    console.log(time2);
    console.log(time2.getTime());
    console.log(time.getTimezoneOffset());
 
Codice:
var time = new Date(2017, 1, 19, 7, 44, 0);
    console.log(time);
    console.log(time.getTime());
    console.log(time.getTimezoneOffset());
var time2 = new Date(2017, 2, 31, 4, 23, 0);
    console.log(time2);
    console.log(time2.getTime());
    console.log(time2.getTimezoneOffset());
Ho corretto il tuo codice, per il quale ti ringrazio, aggiungendo un 2 a fianco a time nell'ultima riga
Codice:
console.log(time2.getTimezoneOffset());
Questo il risultato:
VM254:2 Sun Feb 19 2017 07:44:00 GMT+0100 (CET)
VM254:3 1487486640000
VM254:4 -60
VM254:6 Fri Mar 31 2017 04:23:00 GMT+0200 (CEST)
VM254:7 1490926980000
VM254:8 -120

Effettivamente, guardando il risultato della terza e dell'ultima riga, c'è proprio la differenza di un'ora, l'ora incriminata....forse mettendo questi risultati in due variabili e confrontandole in degli if si può ottenere il risultato aggiungendo o togliendo 3600 secondi alla differenza tra i timestamp.

Ho scritto un'eresia?
 
credo ci sia una soluzione molto più semplice ma per ora mi sfugge
ho trovato un sito che fa il calcolo con js, questo il risultato
Codice:
Start date:Sun Feb 19 2017 08:44:00 GMT+0100 (ora legale Europa occidentale)(epoch/unix time=1487490240)
End date:Fri Mar 31 2017 06:23:00 GMT+0200 (ora solare Europa occidentale)(epoch/unix time=1490934180)
Difference millisec=3443940000 equivalent to (decimal fraction):
.seconds =3443940
.minutes=57399
.hours=956.65
.days=39.860416666666666

3443940000 milliseconds is:
39 days,20 hours, 39 minutes, 0 seconds 0 milliseconds
se ci fai caso i suoi timestamp sono diversi da quelli che hai postato
peccato che l'autore ha offuscato il codice altrimenti si poteva dare una sbirciatina
 
forse ci siamo, fai qualche prova
Codice:
<script>
//    var time = new Date(2017, 1, 19, 7, 44, 0);
    var time = new Date("2017-02-19 07:44:00Z");
    console.log(time);
    console.log(time.getTime());
//    var time2 = new Date(2017, 2, 31, 4, 23, 0);
    var time2 = new Date("2017-03-31 04:23:00Z");
    console.log(time2);
    console.log(time2.getTime());
  
    var diffMs = (time2 - time); // milliseconds between
    var diffDays = Math.floor(diffMs / 86400000); // days
    var diffHrs = Math.floor((diffMs % 86400000) / 3600000); // hours
    var diffMins = Math.round(((diffMs % 86400000) % 3600000) / 60000); // minutes
    alert(diffDays + " giorni, " + diffHrs + " ore, " + diffMins + " minuti");
</script>
 
Mi scuso per il ritardo nella risposta.

Il codice che hai indicato funziona alla perfezione, grazie per l'aiuto.

Spero che questa discussione possa essere di aiuto anche ad altri, vista la particolarità della problematica.
 

Discussioni simili