Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

-_KIKO_-

[Resolvido] Converter timestick para segundos

Recommended Posts

Pessoal, fiz um script em PHP para pegar o UPTIME de um computador usando SNMP, mas o resultado vem em TimeStick...

 

 

Timeticks: (2437779) 6:46:17.79

 

Alguem sabe como converter o timestick para SEGUNDOS???

 

To precisando demais!!!

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, fiz um script em PHP para pegar o UPTIME de um computador usando SNMP, mas o resultado vem em TimeStick...

 

Timeticks: (2437779) 6:46:17.79

 

Alguem sabe como converter o timestick para SEGUNDOS???

 

Bom amigão, coloquei a conta toda em blocos, de uma forma que fique simples de entender:

$TS = 2437779 / 100;
$H = floor( $TS / 3600 );
$M = floor( ( $TS - ( $H * 3600 ) ) / 60 );
$S = floor( ( $TS - ( $H * 3600 ) - ( $M * 60 ) ) );
$m = $TS - ( $H * 3600 ) - ( $M * 60 ) - $S;

printf( "Uptime: %d:%02d:%02d.%02dn" , $H , $M , $S , $m * 100 ); //Uptime: 6:46:17.79

Ai você também pode transformar em uma função:

 

function tt2str( $TT ){
    $ret = array();

    for ( $i = 2 , $TT /= 100 ; $i >= 0 ; $i-- ){
        $div = pow( 60 , $i );
        $ptr = floor( $TT / $div );
        $TT -= $ptr * $div;

        $ret[] = $ptr;
    }

    $ret[] = $TT > 0 ? round( $TT * 100 ) : 0;

    return( vsprintf( "%d:%02d:%02d.%02d" , $ret ) );
}

echo "Uptime: " . tt2str( 2437779 ); //Uptime: 6:46:17.79

Bom, agora que já conseguimos converter os timeticks para hora:minuto:segundo vamos pensar que o PHP e a maioria dos bancos de dados trabalham com TIMESTAMP, então o ideal é que seu timetick seja convertido para Unix Timestamp em vez de uma string, dessa forma, se você for armazenar essa informação em um banco de dados, você poderá usar em uma consulta operadores como BETWEEN:

 

/**
 * Definir a localização é fundamental para que possamos pegar a diferença entre nós e Greenwich
 */
date_default_timezone_set( "America/Sao_Paulo" );

/**
 * Converte um timetick em Unix Timestamp
 * @param integer $TT O timetick
 * @return integer Unix Timestamp
 */
function tt2uts( $TT ){
    $gmt = date( "P" );
    $mtc = array();
    $sum = 0;

    /**
     * Aqui verificamos qual a deferença em horas e minutos entre nós e Greenwich
     */
    if ( preg_match( "/((?:[+-])?d+)(?: :) (d+)/" , $gmt , $mtc ) ){
        $sum -= ( (int) $mtc[ 1 ] ) * 3600;
        $sum -= ( $sum > 0 ? 1 : -1 ) * ( (int) $mtc[ 2 ] ) * 60;
    }

    return( (int) ( $sum + floor( $TT / 100 ) ) );
}

Agora podemos usar qualquer função de data e hora nativa do PHP para trabalhar, por exemplo:

 

echo strftime( "Estamos UP por %H:%M:%S" , tt2uts( 2437779 ) );
var_dump( mktime( 6 , 46 , 17 , 1 , 1 , 1970 ) , tt2uts( 2437779 ) );

O código acima irá exibir:

 

Estamos UP por 06:46:17

int(35177)

int(35177)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa João..

 

Nossa cara que explicação boa, procurei na internet toda uma forma de fazer isso em PHP, com certeza você me ajudou demais.

 

Meu código de testes:

 

$sysuptime	= snmpget("192.168.1.4", "casa", ".1.3.6.1.2.1.1.3.0", 500);
$sysuptime	= str_replace("(","",$sysuptime);
$sysuptime	= str_replace(")","",$sysuptime);
$tempo 		= explode(" ",$sysuptime);

$TS = $tempo[1] / 100;
$H = floor( $TS / 3600 );
$M = floor( ( $TS - ( $H * 3600 ) ) / 60 );
$S = floor( ( $TS - ( $H * 3600 ) - ( $M * 60 ) ) );
$m = $TS - ( $H * 3600 ) - ( $M * 60 ) - $S;

printf( "Uptime: %d:%02d:%02d.%02dn" , $H , $M , $S , $m * 100 );

Ele me retorna

 

Uptime: 0:01:56.56n

 

Que realmente faz 1 minuto que liguei o servidor.

 

Agora, teria como eu escrever na tela

1 minuto e 56 segundos?

 

e assim adiante?

1 dia 12 horas 45 minutos e 23 segundos

nao precisaria escrever 1 ano 1 mes...so de informar os dias, horas e minutos ja esta de bom tamanho.

 

Php tem alguma função nativa que faça isso?

Ou você tem alguma perdida ai?

 

 

Muito obrigado desde ja

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom...tá meio bagunçado, mas...veja aí se te serve em alguma coisa. http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

echo "<br><br><br>Converter um intervalo de datas em horas por extenso";
?><script type="text/javascript">
function horas(){
	var now = new Date();
	var hours = now.getHours();
	var minutes = now.getMinutes();
	var seconds = now.getSeconds()
	if (hours <=9)
hours="0"+hours;
	if (minutes<=9)
minutes="0"+minutes;
	if (seconds<=9)
seconds="0"+seconds;
	var cdate="<b><font color=#000FFF face=arial size=2>"+hours+" horas "+minutes+" minutos e "+seconds+" segundos"+"</font>" 
	clock.innerHTML= cdate;
setTimeout("horas()",1000);

}
</script>

<?
function calculaIntervalo($data1,$data2=''){
	// se data2 for omitida, o calculo sera feito ate a data atual
	$data2 = $data2=='' ? date("d/m/Y",mktime()) : $data2;

	// separa as datas em dia,mes e ano
	list($dia1,$mes1,$ano1) = explode("/",$data1);
	list($dia2,$mes2,$ano2) = explode("/",$data2);

	// so lembrando que o padrao eh MM/DD/AAAA
	$timestamp1 = mktime(0,0,0,$mes1,$dia1,$ano1);
	$timestamp2 = mktime(0,0,0,$mes2,$dia2,$ano2);

	// calcula a diferenca em timestamp
	$diferenca = ($timestamp1 > $timestamp2) ? ($timestamp1 - $timestamp2) : ($timestamp2 - $timestamp1);

	// retorna o calculo em anos, meses e dias
	return (date("Y",$diferenca)-1970)." anos,".(date("m",$diferenca)-1)." meses, ".(date("d",$diferenca))." dias; ";

}
echo "<br><b><font color=#000FFF face=arial size=2>".$valor = calculaIntervalo("01/07/2009","15/08/2009")."</font>"?><span  id="clock" ></span><script>setTimeout("horas()",1000); document.write(doGreeting());</script>;

A impressão será algo to tipo:

Converter um intervalo de datas em horas por extenso

0 anos,1 meses, 14 dias; 17 horas 06 minutos e 42 segundos;

Bom...a ideia é:

 

você informar a data em que o servidor começou a ficar on-line e a ultima data (calcular o intervalo de tempo entre elas), daí pega as horas do dia atual(e veja o total de horas, minutos e segundos.

 

No entanto tem um pequeno probleminha, se você quiser saber o total de horas exatas, não vai ter como, pois a só está calculando o intervalo entre duas data e informando o tempo entre elas, então...você pode colocar o servidor on-line às 23:00 da noite que ainda assim irá contar como um dia todo.

 

Bom...boa sorte aí, qualquer coisa vai postando aí http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora, teria como eu escrever na tela

1 minuto e 56 segundos?

 

e assim adiante?

1 dia 12 horas 45 minutos e 23 segundos

nao precisaria escrever 1 ano 1 mes...so de informar os dias, horas e minutos ja esta de bom tamanho.

 

A implementação é a mesma:

 

$TS = 2437779 / 100;
$D = floor( $TS / 86400 );
$H = floor( ( $TS - ( $D * 86400 ) ) / 3600 );
$M = floor( ( $TS - ( $D * 86400 ) - ( $H * 3600 ) ) / 60 );
$S = floor( ( $TS - ( $D * 86400 ) - ( $H * 3600 ) - ( $M * 60 ) ) );
$m = $TS - ( $D * 86400 ) - ( $H * 3600 ) - ( $M * 60 ) - $S;

$up = array();
if ( $D ) $up[] = sprintf( "%d dia%s" , $D , $D > 1 ? "s" : "" );
if ( $H ) $up[] = sprintf( "%d hora%s" , $H , $H > 1 ? "s" : "" );
if ( $M ) $up[] = sprintf( "%d minuto%s" , $M , $M > 1 ? "s" : "" );
if ( $S ) $up[] = sprintf( "%d segundo%s" , $S , $S > 1 ? "s" : "" );

printf( "Estamos UP por %s\n" , implode( ", " , $up ) ); //Estamos UP por 6 horas, 46 minutos, 17 segundos

Agora se você já estiver usando o PHP 5.3 ai a coisa vai mais longe, você conseguirá saber quantos dias, meses e até anos:

 

/**
 * Converte um timetick em Unix Timestamp
 * @param integer $TT O timetick
 * @return integer Unix Timestamp
 */
function tt2uts( $TT ){
    return( mktime() - ( (int) floor( $TT / 100 ) ) );
}

$odt = new Datetime( strftime( "%Y-%m-%d %H:%M:%S" , tt2uts( 2437779 ) ) );
$now = new Datetime();

$dif = $now->diff( $odt );

$up = array();
if ( $dif->y ) $up[] = sprintf( "%d ano%s" , $dif->y , $dif->y > 1 ? "s" : "" );
if ( $dif->m ) $up[] = sprintf( "%d mes%s" , $dif->m , $dif->m > 1 ? "es" : "" );
if ( $dif->d ) $up[] = sprintf( "%d dia%s" , $dif->d , $dif->d > 1 ? "s" : "" );
if ( $dif->h ) $up[] = sprintf( "%d hora%s" , $dif->h , $dif->h > 1 ? "s" : "" );
if ( $dif->i ) $up[] = sprintf( "%d minuto%s" , $dif->i , $dif->i > 1 ? "s" : "" );
if ( $dif->s ) $up[] = sprintf( "%d segundo%s" , $dif->s , $dif->s > 1 ? "s" : "" );

printf( "Estamos UP por %s\n" , implode( ", " , $up ) ); //Estamos UP por 6 horas, 46 minutos, 17 segundos

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.