-_KIKO_- 0 Denunciar post Postado Agosto 15, 2009 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
João Batista Neto 448 Denunciar post Postado Agosto 15, 2009 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
-_KIKO_- 0 Denunciar post Postado Agosto 15, 2009 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
Roberto_S_Luz 2 Denunciar post Postado Agosto 15, 2009 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
João Batista Neto 448 Denunciar post Postado Agosto 15, 2009 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
-_KIKO_- 0 Denunciar post Postado Agosto 15, 2009 Putz...meu obrigado, voces nao sabem o quanto me ajudaram Nota 10! Compartilhar este post Link para o post Compartilhar em outros sites