Funzione Javascript che calcola la differenza tra una data/ora e adesso

Il software che legge i dati della mia stazione meteo (swpi) invia ogni minuto sul server un file di testo in cui sono presenti alcune variabili in formato JSON, tra cui il timestamp dell’ultima lettura in formato [dd/MM/yyyy-HH:mm:ss].

Volevo sostituire alla data dell’ultima lettura grezza un contatore che visualizzasse una dicitura più umana, del tipo “1h, 3m e 34s fa“.

Ho creato quindi una funzione Javascript che esegue i seguenti passi:

  • legge come parametro la stringa con data/ora
  • ottiene la data/ora attuale in formato compatibile
  • fa il parsing della stringa in ingresso in modo da riconoscere i vari valori di giorno, mese, anno, ora, minuti, secondi.
  • calcola la differenza tra le due date in millisecondi
  • trasforma di nuovo in ore/minuti/secondi e li restituisce come output

Ovviamente il parsing è facilmente adattabile ad altri tipi di stringhe.

function lastUpdate(updatedata) {   
/*funzione che riceve come parametro una stringa di data/ora del tipo "[dd/MM/yyyy-HH:mm:ss]", ne fa il parsing e calcola la differenza con la data/ora
attuale, restituendo in uscita ore, minuti, secondi di differenza tra le due.
Autore: Alessandro Grechi
Data: 02/04/2013
Versione: 1.0
*/

//ottieni ora attuale
var myDate = new Date();
var year = myDate.getFullYear();
var month = myDate.getMonth();
if(month <= 9)
    month = '0'+(month+1);
var day= myDate.getDate();
if(day <= 9)
    day = '0'+day;
    var hour= myDate.getHours();
if(hour<= 9)
    hour = '0'+hour;
var minutes= myDate.getMinutes();
if(minutes<= 9)
    minutes = '0'+minutes;
var seconds= myDate.getSeconds();
if(seconds<= 9)
    seconds = '0'+seconds;


//Parsing della data/ora in ingresso [dd/MM/yyyy-HH:mm:ss]

var str=updatedata;
var n=str.slice(1,20);

var n=n.split("-");
var daysplit=n[0].split("/");
var datesplit=n[1].split(":");

var day1=daysplit[0];
var month1=daysplit[1];
var year1=daysplit[2];


var hour1=datesplit[0];
var minutes1=datesplit[1];
var seconds1=datesplit[2];

//calcola la differenza

var date1 = new Date(year1, month1, day1,  hour1, minutes1, seconds1); // ora in ingresso
var date2 = new Date(year, month, day, hour, minutes, seconds); // ora attuale
if (date2 < date1) {
    date2.setDate(date2.getDate() + 1);
}
var diff = date2 - date1;

//converte i millisecondi in hh, mm, ss leggibili
var msec = diff;
var hh = Math.floor(msec / 1000 / 60 / 60);
msec -= hh * 1000 * 60 * 60;
var mm = Math.floor(msec / 1000 / 60);
msec -= mm * 1000 * 60;
var ss = Math.floor(msec / 1000);
msec -= ss * 1000;

//scrive il risultato della differenza (ultima misura: 0h, 0m, 0s fa)
var result ="";
result += "Ultima misura: ";
if(hh != 0) {
	result += hh;
	result += "h, ";
	}
	
if(mm != 0) {
	result +=  mm;
	result +=  "m e ";
	}
result += ss;
result += "s fa";

return result;

  }  

A quanto pare fa egregiamente il suo lavoro all’interno della dashboard 🙂

A proposito Alessandro

Ingegnere delle Telecomunicazioni con propensione al web2.0 ed il pallino della tecnologia; toscano & casentinese, vivo a Firenze
  • roberto

    ottimo, sembra però che nel calcolo rimane invariato il dato 1h e 12min

    • Ciao… in che senso? C’è un errore nell’algoritmo o vedi i dati della stazione che non si aggiornano? (questo può dipendere da altri fattori, a volte succede anche a me…)

  • Tempo fa avevo fatto una cosa simile in C, penso che anche in JavaScript puoi riutilizzarlo semplicemente facendo la differenza tra l’epoch time attuale (che ottieni da un DateTime() getTime()) e quello ottenuto dal parsing del tempo attuale

    Poi, le costanti da usare sono qua: http://pastebin.ubuntu.com/5682309/