Estou tentando converter um carimbo de data / hora do formato 2009-09-12 20:57:19
e transformá-lo em algo parecido 3 minutes ago
com o PHP.
Encontrei um script útil para fazer isso, mas acho que está procurando um formato diferente para ser usado como variável de tempo. O script que estou querendo modificar para trabalhar com este formato é:
function _ago($tm,$rcs = 0) {
$cur_tm = time();
$dif = $cur_tm-$tm;
$pds = array('second','minute','hour','day','week','month','year','decade');
$lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600);
for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]);
$no = floor($no);
if($no <> 1)
$pds[$v] .='s';
$x = sprintf("%d %s ",$no,$pds[$v]);
if(($rcs == 1)&&($v >= 1)&&(($cur_tm-$_tm) > 0))
$x .= time_ago($_tm);
return $x;
}
Acho que nessas primeiras linhas o script está tentando fazer algo parecido com isto (matemática de formato de data diferente):
$dif = 1252809479 - 2009-09-12 20:57:19;
Como eu converteria meu carimbo de data / hora para esse formato (unix?)?
Respostas:
Use exemplo:
A entrada pode ser qualquer formato de data e hora suportado .
Resultado :
Função:
fonte
$full
deve ser uma entrada de string para filtrar a saída conforme necessário). por exemplotime_elapsed_string($datetime, $format = "ymw")
. Versão PS Flat: stackoverflow.com/a/5010169/318765$full = false
para$level = 7
eif (!$full) $string = array_slice($string, 0, 1);
para$string = array_slice($string, 0, $level);
e liguetime_elapsed_string($datetime, 2)
para obter apenas as duas seqüências de datas mais altas. Eu acho que esse shoud se encaixa em todas as necessidades.Unknown property (w)
nesta linha$diff->w = floor($diff->d / 7);
Unknown property (w)
no PHP5.3 e abaixo, converta $ diff de um objeto em uma matriz e ajuste o restante do código de acordo. Eu tenho a correção postada aqui: stackoverflow.com/a/32723846/235633fonte
30days for month
, e12x30days for year
, e por isso retornará um número inválido de anos abaixo do ano <= 1978. Exemplo em que retorna 39 anos, mas deve 38. E também não funciona para anos abaixo 1970.fonte
Esta é realmente uma solução melhor que eu encontrei. Utiliza jQuery, no entanto, funciona perfeitamente. Também atualiza automaticamente mesma forma que o SO e o Facebook, para que você não precise atualizar a página para ver as atualizações.
Este plugin irá ler o seu
datetime
attr na<time>
tag e preenchê-lo para você.http://timeago.yarp.com/
fonte
Não sei por que ninguém mencionou Carbon ainda.
https://github.com/briannesbitt/Carbon
Esta é realmente uma extensão do php dateTime (que já foi usada aqui) e possui o método: diffForHumans. Então, tudo que você precisa fazer é:
mais exemplos: http://carbon.nesbot.com/docs/#api-humandiff
Prós desta solução:
fonte
Encontrei resultados como o seguinte feio:
Por isso, percebi uma função que respeita os plurais, remove valores vazios e, opcionalmente, é possível encurtar a saída:
Parece muito melhor:
Opcionalmente, use
$level = 2
para reduzi-lo da seguinte forma:Remova a
$lang
peça se precisar apenas em inglês ou edite esta tradução para atender às suas necessidades:fonte
explode
earray_combine
.fonte
Modifiquei um pouco a função original (na minha opinião, mais útil ou lógica).
fonte
Eu fiz isso e está funcionando muito bem, está funcionando tanto para carimbo de data / hora do Unix como para hora
1470919932
formatada como16-08-11 14:53:30
fonte
switch (true)
mesmo que$time
avaliarátrue
?Só para jogar em outra opção ...
Embora eu prefira a publicação do método DateTime aqui , não gostei do fato de exibir 0 anos etc.
fonte
isso ajuda você a ver
fonte
Eu costumo usar isso para descobrir a diferença entre
current
epassed
datetime stamp
RESULTADO
CÓDIGO
fonte
Estou ciente de que há várias respostas aqui, mas foi isso que eu vim. Isso lida apenas com os valores DATETIME do MySQL conforme a pergunta original à qual eu estava respondendo. A matriz $ a precisa de algum trabalho. Congratulo-me com comentários sobre como melhorar. Ligue como:
eco time_elapsed_string ('2014-11-14 09:42:28');
fonte
Eu tentei isso e funciona bem para mim
Verifique este link para referência aqui
Obrigado! e divirta-se.
fonte
Foi com isso que eu fui. É uma versão modificada do post de Abbbas Khan:
fonte
Muitas soluções aqui não foram responsáveis por arredondamentos. Por exemplo:
O evento aconteceu às 15h, dois dias atrás. Se você estiver verificando às 14:00, será exibido um dia atrás. Se você estiver verificando às 16h, ele será exibido há dois dias.
Se você estiver trabalhando com tempo unix, isso ajuda:
Não é perfeito se você estiver preocupado com segundos bissextos e horário de verão.
fonte
Tente isso, achei nos meus códigos antigos, que mostram o resultado correto
Exemplo:
echo ago('2020-06-03 00:14:21 AM');
Resultado:
6 days
fonte
Você terá que pegar cada pedaço individual do seu carimbo de data e hora e convertê-lo no horário do Unix. Por exemplo, para o carimbo de data / hora, 12/09/2009 20:57:19.
(((2008-1970) * 365) + (8 * 30) +12) * 24 + 20 forneceria uma estimativa ÁSPERA das horas desde 1º de janeiro de 1970.
Pegue esse número, multiplique por 60 e adicione 57 para obter os minutos.
Pegue isso, multiplique por 60 e adicione 19.
Isso o converteria de maneira grosseira e imprecisa.
Existe alguma razão para você não usar o tempo normal do Unix para começar?
fonte
Há algum problema com a exibição de algum idioma atrás, por exemplo, em árabe, há 3 formatos necessários para exibir a data. Eu uso essas funções em meus projetos, espero que elas possam ajudar alguém (qualquer sugestão ou melhoria, serei mais atraente :))
fonte
fonte
Aqui está a minha solução, verifique e modifique de acordo com seus requisitos
obrigado
fonte
fonte
Esta função não foi criada para ser usada no idioma inglês. Eu traduzi as palavras em inglês. Isso precisa de mais correção antes de usar para o inglês.
fonte
Uso de:
Função:
fonte
Resposta ligeiramente modificada de cima:
fonte
A seguir, é uma solução muito simples e extremamente eficiente.
eco timeElapsed (1201570814);
Saída de amostra:
6yrs 4monthsweeks 4days 12hrs 40mins e 36secs.
fonte
Aqui está a minha solução para um módulo de notificação que criei há algum tempo. Ele retorna uma saída semelhante à lista suspensa de notificações do Facebook (por exemplo, 1 dia atrás, Agora, etc).
fonte
basta passar a data e hora para esta função. seria impresso no formato de tempo atrás para você
fonte
Estou usando a função a seguir há vários anos. E está funcionando bem:
fonte