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 🙂