É estranho que a pergunta solicite a conversão de milissegundos , mas todos respondem como converter microssegundos. Eu sei que você pode converter entre os dois, mas responder à pergunta em vez de copiar e colar o código não relacionado do documento PHP ou de outro lugar seria bom.
Microssegundos (adicionado no PHP 5.2.2). Observe que date()sempre será gerado, 000000já que leva um parâmetro inteiro, ao passo que DateTime::format()oferece suporte a microssegundos se tiver DateTimesido criado com microssegundos.
Eu geralmente opto pelo segundo formulário porque é mais fácil de ler e entender. Além disso, DateTime é muito mais flexível e robusto do que as funções de data / hora. O tratamento de microssegundos é um caso em questão.
Herbert
Eu concordo com Herbert. @slik, esta É a melhor resposta :)
Marco Sulla
3
@Geo e AlBundy podem ser você tentando isso em uma máquina com php <5.2.2? PHP 5.4.39 executa perfeitamente bem ...
RichardBernards
não seria fácil? data ('mdY H: i: s'). (int) microtime (verdadeiro);
Anant
@Anant, seria bem fácil, de fato. Mas errado. ;) O que você obtém lá é apenas a época em segundos. (Infelizmente, não funcionaria com microtime(false)nenhum deles.)
Sz.
138
Você pode fazer isso prontamente com o formato de entrada U.u.
Obrigado a giggsey por apontar uma falha em minha resposta original, acrescentando number_format()à linha deve corrigir a caixa do segundo exato. Que pena que não parece mais tão elegante ...
No entanto, a técnica descrita aqui é inicializar o objeto DateTime usando microtime()que retorna o número de segundos decorridos desde a época do Unix (01 de janeiro de 1970 00:00:00 GMT).
Isso significa que o objeto DateTime é inicializado implicitamente em UTC, o que é adequado para tarefas internas do servidor que desejam apenas rastrear o tempo decorrido.
Se precisar exibir a hora para um fuso horário específico, você precisará defini-lo de acordo. No entanto, isso deve ser feito como uma etapa separada após a inicialização ( não usando o terceiro parâmetro de createFromFormat()) por causa das razões discutidas acima.
O setTimeZone()método pode ser usado para cumprir esse requisito.
Nota: DateTime::createFromFormat('U.u', microtime(true));retornará falso se for microtime(true)executado no segundo exato. Ele retorna '1438616239' em vez de '1438616239.000000'.
giggsey
1
Ótima solução, obrigado. Parece que estou perdendo meu horário local criando $ now do microtime. Qualquer ideia?
dia
1
@daVe Eu adicionei algumas informações sobre fusos horários, espero que seja isso que você estava procurando.
ArchCodeMonkey
1
O number_formaté sempre necessário, mesmo quando não está no segundo exato. Caso contrário, você estará à mercê da precisionopção de configuração do PHP (para "exibição"), que não é alta o suficiente por padrão no PHP 7.0, causando uma perda de precisão (não precisa até o microssegundo).
Teoh Han Hui
1
Sempre role para baixo em StackOverflow
tom10271
15
Aqui está uma abordagem um pouco mais curta. Em vez de trabalhar para criar uma data / hora numérica de alta precisão, converto o valor de microssegundo em uma string, removo o 0e o adiciono ao final da string de data / hora. Posso cortar facilmente o número de decimais ajustando o parâmetro de comprimento da corda; aqui eu uso 4para obter milissegundos, mas você poderia usar 7para obter microssegundos.
Se você precisar limitar o número de casas decimais, a linha abaixo (mgutt de crédito) seria uma boa alternativa. (Com o código abaixo, o 6 limita o número de casas decimais a 6.)
Você perdeu a precisão e o zero à esquerda por segundos. Portanto, a versão correta deve ser echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));. Explicação do motivo pelo qual precisamos 09: stackoverflow.com/a/28739819/318765
mgutt
Você errou a precisão de novo;)echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
mgutt
Mas cuidado, substr()não arredondar. E, em combinação com round()ele, cortaria os zeros finais: stackoverflow.com/questions/7493305/… Esse é o motivo pelo qual propus sprintf().
mgutt de
@mgutt Quando o primeiro dígito não seria zero? Basicamente, o que é necessário é simplesmente remover o zero que sempre está lá quando se obtém o resto do fmod por 1. A questão pede microssegundos, mas na forma de casas decimais dos segundos. Não há razão para limitar o número de casas decimais. Mais casas decimais são simplesmente melhor precisão.
ghbarratt
@mgutt Eu adicionei sua primeira alternativa sugerida à minha resposta, explicando que seria uma boa maneira de limitar o número de casas decimais, se necessário
ghbarratt
3
Se você deseja formatar uma data como a do JavaScript (new Date()).toISOString()por algum motivo, é assim que você pode fazer em PHP:
Não. Não use matemática no número de ponto flutuante, é impreciso. Também não perca tempo chamando várias funções. Basta usar substr () para truncar a data formatada para três casas decimais.
LS de
O truncamento de @LS não arredondará o terceiro decimal, o que provavelmente é ainda mais impreciso. Os flutuadores não quebram até que você entre em precisões realmente mínimas; 3 casas decimais devem ser suficientes. Na verdade, não acho que estou alterando a precisão, os flutuadores ficam mais precisos quanto mais perto você chega de 0. Subtrair o número inteiro não deve alterar as casas decimais AFAIK.
MPEN
Sobre o quê date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
F8ER
@ F8ER Se o seu $timejá estiver em milissegundos, sim, isso funcionaria tecnicamente. Não ameis o substrcorte, mas eu acho que ele iria trabalhar para datas entre 2001 e 2286.
MPEN
Sim, $timeé MS, mas e 2286, quero dizer, por que você pensa assim e como seria possível escapar dela?
F8ER
3
Isso é baseado na resposta do ArchCodeMonkey.
Mas simplificado, se você quiser algo rápido que funcione.
Microssegundos (adicionado no PHP 5.2.2). Observe que date () sempre gerará 000000, pois leva um parâmetro inteiro, enquanto DateTime :: format () oferece suporte a microssegundos.
Sim, de acordo com a resposta acima (e minhas tentativas) new DateTime()também retornará 0000 para u. Mas se você fornecer um tempo de precisão de microssegundos ao instanciá-lo, ele funcionará bem.
scipilot
@scipilot ok, então como você faz isso?
Geo
@Geo veja a resposta aceita. new DateTime( 'Y-m-d H:i:s.'.$micro);
scipilot
0
Com o PHP 7.0+ agora aqui, você pode fazer o seguinte:
Apara os últimos 4 zeros da string para Date()controlar a data.
Usa a data para formatar os milissegundos em uma string de data e hora que DateTime possa entender.
DateTime()pode então permitir que você modifique o fuso horário em que você está, mas certifique-se de que date_default_timezone_set("Timezone");esteja definido antes de usar DateTime()funções e classes.
É uma boa prática usar um construtor em suas classes para garantir que você DateTime()esteja no fuso horário correto quando as classes ou funções forem usadas.
Respostas:
php.net diz:
Portanto, use o mais simples:
Recomendado e usar a
dateTime()
classe do referenciado:A nota
u
é microssegundos (1 segundo = 1000000 µs).Outro exemplo de php.net :
Referência de
dateTime()
em php.netEu respondi a pergunta tão curta e simplificada para o autor. Consulte para obter mais informações ao autor: obtendo o formato de data mdY H: i: su de milissegundos
fonte
microtime(false)
nenhum deles.)Você pode fazer isso prontamente com o formato de entrada
U.u
.Isso produz a seguinte saída:
Na página de manual do PHP para formatos de data:
http://php.net/manual/en/function.date.php
Obrigado a giggsey por apontar uma falha em minha resposta original, acrescentando
number_format()
à linha deve corrigir a caixa do segundo exato. Que pena que não parece mais tão elegante ...http://php.net/manual/en/function.number-format.php
Uma nota sobre os fusos horários em resposta ao DaVe.
Normalmente, o
createFromFormat()
método usará o fuso horário local se nenhum for especificado.http://php.net/manual/en/datetime.createfromformat.php
No entanto, a técnica descrita aqui é inicializar o objeto DateTime usando
microtime()
que retorna o número de segundos decorridos desde a época do Unix (01 de janeiro de 1970 00:00:00 GMT).http://php.net/manual/en/function.microtime.php
Isso significa que o objeto DateTime é inicializado implicitamente em UTC, o que é adequado para tarefas internas do servidor que desejam apenas rastrear o tempo decorrido.
Se precisar exibir a hora para um fuso horário específico, você precisará defini-lo de acordo. No entanto, isso deve ser feito como uma etapa separada após a inicialização ( não usando o terceiro parâmetro de
createFromFormat()
) por causa das razões discutidas acima.O
setTimeZone()
método pode ser usado para cumprir esse requisito.http://php.net/manual/en/datetime.settimezone.php
Como um exemplo:
Produz a seguinte saída:
Observe que se você deseja inserir no mysql, o formato da hora precisa ser:
fonte
DateTime::createFromFormat('U.u', microtime(true));
retornará falso se formicrotime(true)
executado no segundo exato. Ele retorna '1438616239' em vez de '1438616239.000000'.number_format
é sempre necessário, mesmo quando não está no segundo exato. Caso contrário, você estará à mercê daprecision
opção de configuração do PHP (para "exibição"), que não é alta o suficiente por padrão no PHP 7.0, causando uma perda de precisão (não precisa até o microssegundo).Aqui está uma abordagem um pouco mais curta. Em vez de trabalhar para criar uma data / hora numérica de alta precisão, converto o valor de microssegundo em uma string, removo o
0
e o adiciono ao final da string de data / hora. Posso cortar facilmente o número de decimais ajustando o parâmetro de comprimento da corda; aqui eu uso4
para obter milissegundos, mas você poderia usar7
para obter microssegundos.Para um valor microtime () de
0.98236000 1407400573
, retorna08-07-14 01:08:13.982
.fonte
Eu estou usando
fonte
exemplo de saída:
Se você precisar limitar o número de casas decimais, a linha abaixo (mgutt de crédito) seria uma boa alternativa. (Com o código abaixo, o 6 limita o número de casas decimais a 6.)
exemplo de saída:
fonte
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
. Explicação do motivo pelo qual precisamos09
: stackoverflow.com/a/28739819/318765echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()
não arredondar. E, em combinação comround()
ele, cortaria os zeros finais: stackoverflow.com/questions/7493305/… Esse é o motivo pelo qual propussprintf()
.Se você deseja formatar uma data como a do JavaScript
(new Date()).toISOString()
por algum motivo, é assim que você pode fazer em PHP:Saída de amostra:
Apenas para provar que subtrair o número inteiro não reduz a precisão da parte decimal:
PHP fez em volta das casas decimais, mas arredondado-los da mesma forma em ambos os casos.
fonte
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));
?$time
já estiver em milissegundos, sim, isso funcionaria tecnicamente. Não ameis osubstr
corte, mas eu acho que ele iria trabalhar para datas entre 2001 e 2286.$time
é MS, mas e2286
, quero dizer, por que você pensa assim e como seria possível escapar dela?Isso é baseado na resposta do ArchCodeMonkey.
Mas simplificado, se você quiser algo rápido que funcione.
Então para mim então
fonte
Aqui está outro método que considero um pouco mais elegante / simples:
fonte
fonte
A partir do PHP 7.1, você pode simplesmente fazer isso:
Será exibido como:
fonte
A documentação diz o seguinte:
Ou seja, use DateTime em seu lugar.
fonte
new DateTime()
também retornará 0000 para u. Mas se você fornecer um tempo de precisão de microssegundos ao instanciá-lo, ele funcionará bem.new DateTime( 'Y-m-d H:i:s.'.$micro);
Com o PHP 7.0+ agora aqui, você pode fazer o seguinte:
Isso faz o seguinte em ordem:
Date()
controlar a data.DateTime()
pode então permitir que você modifique o fuso horário em que você está, mas certifique-se de quedate_default_timezone_set("Timezone");
esteja definido antes de usarDateTime()
funções e classes.DateTime()
esteja no fuso horário correto quando as classes ou funções forem usadas.fonte
se estiver usando Carbon, você pode usar a especificação definida "RFC3339_EXTENDED". ou personalize-o.
fonte
Com base na resposta de @ArchCodeMonkey.
Se você tiver,
declare(strict_types=1)
você deve lançar o segundo argumento para stringfonte
Eu escolhi algumas maneiras diferentes:
1) microtime + sscanf + data:
Não sei por que microtime () retorna 10 caracteres (0.dddddd00) para a parte de microssegundos, mas talvez alguém possa me dizer?
2) DateTime :: createFromFormat + Datetime-> format:
não funciona no PHP 5.x ...
3) gettimeofday + date:
-
4) microtime + number_format + DateTime :: createFromFormat + DateTime-> format:
-
5) microtime + sprintf + DateTime :: createFromFormat + DateTime-> format:
-
fonte