Questa domanda mi ha dato lo stimolo per PROVARE a creare una classe tempo che faccia operazioni su tempi.
Non sono molto pratico di classi, perciò, attenzione:
classe tempo
codice:
/*--------------------------------------------------------------------------------
definisco il costruttore della classe
accetta o tre parametri: ore, minuti, secondi
o una stringa tipo "ore:minuti:secondi"
---------------------------------------------------------------------------------*/
function tempo(ore, minuti, secondi)
{
if(typeof(minuti) == "undefined" || typeof(secondi) == "undefined")
{
if(typeof(ore) == "string" )
{
var s = ore.split(":");
if(s.length != 3) {alert("parametri sbagliati");return;};
this.ore = parseInt(s[0], 10);
this.minuti = parseInt(s[1], 10);
this.secondi = parseInt(s[2], 10);
}
else {alert("parametri sbagliati");return;};
}
else if (typeof(ore) == "number" && typeof(minuti) == "number" && typeof(secondi) == "number" )
{
this.ore = parseInt(ore, 10);
this.minuti = parseInt(minuti, 10);
this.secondi = parseInt(secondi, 10);
}
else {alert("parametri sbagliati");return;};
}
//metodo di istanza: restituisce il tempo nella forma ore:minuti:secondi
tempo.prototype.toString = function()
{
var minuti = (this.minuti < 10)? "0" + this.minuti: this.minuti;
var secondi = (this.secondi < 10)? "0" + this.secondi: this.secondi;
return this.ore + ":" + minuti + ":" + secondi;
}
//metodo di istanza: restituisce i secondi totali di tempo
tempo.prototype.getSeconds = function()
{
return this.secondi + this.minuti * 60 + this.ore * 3600;
}
//metodo di classe
//somma due o più tempi e restituisce il tempo totale
tempo.add = function(a, b)
{
if(arguments.length < 2)
{alert("parametri sbagliati");return;};
var ore, minuti, secondi;
var resto = 0; somma = 0, riporto = 0;
somma = sumSecondi(arguments);
riporto = Math.floor(somma / 60);
resto = somma % 60;
secondi = resto;
somma = sumMinuti(arguments) + riporto;
riporto = Math.floor(somma / 60);
resto = somma % 60;
minuti = resto;
somma = sumOre(arguments) + riporto;
ore = somma;
return new tempo(ore, minuti, secondi);
function sumSecondi(a)
{
var tot = 0;
for(var i = 0; i < a.length; i++)
tot += a[i].secondi;
return tot;
}
function sumMinuti(a)
{
var tot = 0;
for(var i = 0; i < a.length; i++)
tot += a[i].minuti;
return tot;
}
function sumOre(a)
{
var tot = 0;
for(var i = 0; i < a.length; i++)
tot += a[i].ore;
return tot;
}
}
//metodo di classe
//sottrae il tempo b dal tempo a
//restituisce il tempo risultante
tempo.subtract = function(a, b)
{
var s1 = a.getSeconds();
var s2 = b.getSeconds();
var s = Math.abs(s1 - s2);
var ore, minuti, secondi;
ore = Math.floor(s / 3600); if(s2 > s1) ore = -ore;
s = s - ore * 3600;
minuti = Math.floor(s / 60);
s = s - minuti * 60;
secondi = s;
return new tempo(ore, minuti, secondi);
}
l'ho collaudata così:
codice:
//due modi diversi per creare oggetti tempo
var t1 = new tempo("10:20:36");
var t2 = new tempo(8,50,49);
//sommo 2 o più tempi
var t3 = tempo.add(t1, t2);
//visualizzo il risultato
alert( t1.toString() + " +\n" + t2.toString() + " =\n" + t3.toString() );
//sotraggo tempo t2 da tempo t1
var t4 = tempo.subtract(t1, t2);
//visualizzo il risultato
alert(t1.toString() + " -\n" + t2.toString() + " =\n" + t4.toString());
//sommo più tempi e restituisco il risultato
alert("Somma di più tempi\n" + tempo.add(new tempo("10:20:36"), new tempo("8:50:49"), new tempo("9:12:58")).toString());