Ir para conteúdo

POWERED BY:

Arquivado

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

diego.baiao

Data Time EPOCH

Recommended Posts

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

×

Informação importante

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