Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 095
**1490903060177 **=> 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)**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>";
?>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>";echo $mSecs."<br>";echo $mSecs."<br>";
echo $data.$mSecs."<br>"; //resposta final data e milesegundo
?>
Encerrando assim esse post. Resolvido!
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