wBB 0 Denunciar post Postado Janeiro 7, 2008 Olá, Sou iniciante, criei uma aplicação PHP com BD Access e estou com um probleminha em uma simples comparação de datas. Estou fazendo o seguinte: $last_con = strtotime($last_con); // $last_con = data e hora retirada de um registro no BD $now = strtotime(now); if (($now - $last_con) < 60) echo "ONLINE"; else echo "OFFLINE";O problema é que o horário extraído do BD tem que estar sempre uma hora a frente do horário local para que a comparação seja verdadeira. Exemplo: se o horário local for 19:30:00, a comparação "$now - $last_con) < 60" só será verdadeira de "last_con >= 20:30:00". Alguém pode me ajudar a enteder o que está ocorrendo e como corrigir? Valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 7, 2008 Primeiramente, bem-vindo ao iMasters! :D Você está trabalhando com timestamps, que são valores em segundos. Por isso, aquele "60" representa 60 segundos. Para ser uma hora, faça 60 * 60. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
wBB 0 Denunciar post Postado Janeiro 7, 2008 Olá Beraldo. Grato pela atenção. Sua avaliação está correta, ou seja, estou trabalhando com tempo em segundos. A intenção era essa mesma. A idéia é verificar se o horário corrente é maior ou igual ao horário de referência em até 60 segundos. Se for, gera a mensagem "OFFLINE". Se a diferença entre os dois horários for menor que 60 segundos, gera a mensagem "ONLINE". O que está ocorrendo é, se o horário corrente for 19:30:00 e o horário retirado do banco de dados for, por exemplo, 19:35:00, a mensagem comparação dá FALSE: if ((19:30:00 - 19:35:00) < 60 // A resposta está dando FALSE echo "ONLINE"; else echo "OFFLINE"; Já se o horário retirado do banco de dados for, por exemplo, 20:35:00: if ((19:30:00 - 20:35:00) < 60 // A resposta está dando TRUE echo "ONLINE"; else echo "OFFLINE"; Verifique que nas duas situações deveria dar TRUE a comparação, mas isso só ocorre quando o horário de referência for maior que o horário corrente em 1 hora. O que pode estar ocorrendo? OBS.: Meu Windows não está com ajuste automático de horário de verão. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 7, 2008 A data está no formato mostrado no seu script? Para poder usar strtotime(), ela deve estar no formato YYYY-MM-DD Compartilhar este post Link para o post Compartilhar em outros sites
wBB 0 Denunciar post Postado Janeiro 8, 2008 Beraldo, Não estou pegango a data e hora em timestamp quando faço "$now = strtotime(now)"? Depois de fazer isso, se for impresso na tela o valor de "$now" está aparecendo um valor numérico coerente com o que deveria ser em timestamp... O mesmo está ocorrendo com a data e hora retirada do banco de dados. Inclusive são valores numéricos bem próximos, pois são datas e horas próximas, o que mostra que a conversão parece estar correta. Também tem um detalhe: o problema está ocorrendo com a parte de horário. Já a parte de data está correto. Desculpe o pouco conhecimento, mas quando você perguntou "A data está no formato mostrado no seu script?" o que eu deveria estar fazendo no meu script que não está sendo mostrado no exemplo do código que estou usando? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 8, 2008 O strtotime('now') está certo Eu perguntei isso por causa desta linha: $last_con = strtotime($last_con); // $last_con = data e hora retirada de um registro no BD se $last_con não estiver no formato YYYY-MM-DD, strtotime() não retornará o timestamp correto. Compartilhar este post Link para o post Compartilhar em outros sites
wBB 0 Denunciar post Postado Janeiro 8, 2008 Beraldo, acho que ainda não consegui verificar o que você está sugerindo. Por desencargo de conciência fiz o seguinte com este parâmetro: $last_con = date('Y-m-d H:i:s', $minha_datahora_do_BD); $last_con = strtotime($last_con); Entendo que isso deva garantir que o valor convertido esteja no formato que você sugeriu. Mesmo assim não funcionou. Eu entendi corretamente o que você estava sugerindo ou não tem nada a ver? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 8, 2008 Aquele date() só funcionará se $last_con for um timstamp. Qual é o formato da data armazenada no banco de dados? É YYYY-MM-DD (ano-mes-dia)? Ou é o timestamp (valor inteiro, retornado por time(), por exemplo)? Compartilhar este post Link para o post Compartilhar em outros sites
wBB 0 Denunciar post Postado Janeiro 8, 2008 Entendi agora sua dúvida.... Não sei te responder como o banco de dados Access responde ao PHP. Se eu abrir o arquivo do Access, é possível ver a data em formato "DD/MM/YYYY hh:mm:ss". Porém, quando eu salvo a informação de data e hora no banco o formato é "YYYY/MM/DD hh:mm:ss", até para evitar estes inconvenientes. O acesso do PHP ao banco de dados está sendo feito por meio do ADODB. Detalhe que ababei esquecendo de comentar: se eu imprimir na tela a data lida no banco de dados, em formato "YYYY/MM/DD hh:mm:ss" ou qualquer outro formato, o valor apresentado está correto, ou seja, o que está sendo impresso corresponde exatamente ao que está no banco de dados. Só que quando eu executo a comparação para saber se uma data é maior que a outro em até 60 segundos, não calcula corretamente... Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 8, 2008 Dê um echo em $last_con, para ver como ela está vindo. Faça isso antes de usá-la em qualquer função, inclusive strtotime(). Execute este script e veja o resultado: $data1 = "2008/01/08"; $data2 = "2008-01-08"; echo "<p>Data: " . date('Y-m-d', $data1) . " | " . date('Y-m-d', $data2) . "</p>"; echo "<p>Timestamp: " . strtotime($data1) . " | " . strtotime($data2) . "</p>"; Note que date() não funcionou em ambos os casos, pois em nenhum deles é passado um timestamp no par6ametro. Já strtotime() considera as duas formatações. Por isso é importante saber como a data está vindo do BD. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
wBB 0 Denunciar post Postado Janeiro 8, 2008 No registro do banco de dados, registro que estou testando, se eu abrir o BD para ver a data e hora, mostrará "8/1/2008 14:40:00" Ao executar um echo deste campo de data e hora, logo após executar o Select para ler o registro no banco de dados, o resultado é "2008-01-08 14:40:00" (echo $minha_datahora_do_BD; // Mostra 2008-01-08 14:40:00). Ao carregar a variável "$last_con = strtotime($minha_datahora_do_BD);" e executar um echo da variável "$last_con" em seguida, o resultado é 1199810400 (echo $last_con; // Mostra 1199810400). é isso mesmo que deveria mostrar? Compartilhar este post Link para o post Compartilhar em outros sites
wBB 0 Denunciar post Postado Janeiro 9, 2008 Resolvido! Apesar de resolvido, não sei o motivo... O que fiz para resolver foi acessar as propriedades de Data e Hora do Windows, marcar e desmarcar a opção "Ajustar automaticamente o relógio para horário de verão" (por padrão eu deixo desmarcado e mantive desmarcado). Apenas com esta ação tudo começou a funcionar. Reparei agora que o problema descrito antes não tinha relação com a data e hora que era extraída do BD, que estava correta, mas sim com a data e hora que o PHP pegava do sistema, que estava adiantada em uma hora ao que o relógio do Windows estava marcando (...do além!). De qualquer forma, obrigado ao Beraldo pela atenção em tentar resolver este problema um tanto estranho. Se alguém souber o motivo que levava o PHP a pegar o horário errado, por favor postem aqui. T+ Compartilhar este post Link para o post Compartilhar em outros sites