diego.baiao 0 Denunciar post Postado Março 30, 2017 Olá amigos, Estou com uma baita dificuldade que preciso converter uma data no formato epoch e pegar na precisão de milisegundos. Tenho uma prestadora de serviço que me atualiza 3 status até em um mesmo segundo e na hora de eu pegar no php e gravar no banco a ordem é tão rápida que ele chega a inverter e acabado gravando na ordem errada por não conseguir trabalhar com o formato EPOCH. Ex: status 1 (agendado), status 2(em fila), status 3(entregue). Acontece que o status 2 e 3 vem juntos no mesmo segundo mais em milisegundos diferentes mais não consigo converter a data epoch deles, somente pego como timestamp normal que vai ate segundos dai ele acaba assumindo que o status 3 veio na frente do status 2. tenho esse epoch como exemplos abaixo, no site da epochconverter.com se passar eles me da bonitinho com milesegundo, ficando a resposta: 1490902478095 => Resposta GMT: Thu, 30 Mar 2017 19:34:38.095 GMT Aqui eu tenho os milesegundos 0951490903060177 => Resposta GMT: Thu, 30 Mar 2017 19:44:20.177 GMT Aqui eu tenho os milesegundos 177 Ja tentei alguns codigos que vi mais nada deu certo ate agora, sendo que o resultado sai conforme abaixo: Código PHP: $sent_epoch_et = 1490902478095; echo gmdate('r', $sent_epoch_et); RESPOSTA: Sun, 24 May 1987 03:46:23 +0000 (FICA ESSE +0000) $delivered_epoach_at = 1490903060177; echo gmdate('r', $delivered_epoach_at); RESPOSTA: Sat, 30 May 1987 21:27:45 +0000 (FICA ESSE +0000) obs: O EPOCH que preciso tem 13 numeros a do site com exemplo tem 10 digito, observem que exatamente os 3 ultimos digitos são os milisegundos. Mais como trabalhar sem gambiarra com eles. Queri atingir o resultado igual do site da epoch (Thu, 30 Mar 2017 19:34:38.095) Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Março 30, 2017 PHP trabalha com Unix Timestamp, que são segundos a partir de um marco (no caso, 1º de Janeiro de 1970). O melhor que poderá fazer para resolver o seu problema é o seguinte: https://www.sitepoint.com/community/t/how-to-format-datetime-output-with-milliseconds-or-microseconds/182332/5 Compartilhar este post Link para o post Compartilhar em outros sites
diego.baiao 0 Denunciar post Postado Abril 1, 2017 Sim Gabriel, consegui fazer um meio que vai dar certo. Eu peguei o variável inteira de 13 digitios, dei um explode peguei com subtr os primeiros 10 dígitos e a conversão é feita usando o gmdate com parâmetro "r" depois eu peguei os 3 últimos dígitos e fiz um concatenação já que é os mile segundos, não é o ideal mais funciona rs. Ficou o código conforme abaixo: Mesmo assim obrigado pela ajuda. <?php $epoch_sent = 1490367029499; // GMT: Fri, 24 Mar 2017 14:50:29.499 GMT // Your time zone: 24/03/2017 11:50:29 GMT-3:00 $epoch_delivered = 1490367035296; // GMT: Fri, 24 Mar 2017 14:50:35.296 GMT // Your time zone: 24/03/2017 11:50:35 GMT-3:00 if (strlen($epoch_sent) == 13){ $parte1 = substr($epoch_sent, 0,10); //10 digitios iniciais => data hora com H:M:S $parte2 = substr($epoch_sent, 10,13); //3 digitos finais serão os milesegundos echo $parte1." (data formato epoch tradução)<br>"; echo $parte2." (milisegundo do epoch) <br>"; $epoch_envio = date("Y-m-d H:i:s", $parte1).".".$parte2; echo $epoch_envio." (Forma final da data em milesegundos)"; }else{ echo "Não deu certo"; } echo "<br><br>"; if (strlen($epoch_delivered) == 13){ $parte1 = substr($epoch_delivered, 0,10); //data hora com H:M:S $parte2 = substr($epoch_delivered, 10,13); //3 digitos finais milesegundos echo $parte1." (data formato epoch tradução)<br>"; echo $parte2." (milisegundo do epoch) <br>"; $epoch_retorno = date("Y-m-d H:i:s", $parte1).".".$parte2; echo $epoch_retorno." (Forma final da data em milesegundos)"; }else{ echo "Não deu certo"; } ?> <?php // Outro esquema mais sem usar EPOCH pode vir a ajudar alguém algum dia peguei de um site por ai echo "Quebrando os segundos por 1000;<br>"; $micro_date = microtime(); $date_array = explode(" ",$micro_date); $date = date("Y-m-d H:i:s",$date_array[1]); echo "Date: $date:" . $date_array[0]."<br>"; ?> Compartilhar este post Link para o post Compartilhar em outros sites
diego.baiao 0 Denunciar post Postado Abril 1, 2017 Opa agora fiz algo melhor com o site que me indicou Gabriel, obrigado ficou melhor o código mais compacto! Obrigado, agora temos varias utilizações hehehe. <?php $time = microtime(true); //epoch + milisegundos echo $time."<br>"; $data = date('Y-m-d H:i:s'); //formato data escolhido com timezone Brasil $mSecs = $time - floor($time); //pega apenas os milesegundos (floor arredonda frações para baixo) echo $mSecs."<br>"; $mSecs = substr($mSecs,1,5); //ajusta no subtr para pegar a quantidade de casas dos milesegundos echo $mSecs."<br>"; echo $data.$mSecs."<br>"; //resposta final data e milesegundo ?> Encerrando assim esse post. Resolvido! Compartilhar este post Link para o post Compartilhar em outros sites