Como faço para obter a diferença (em segundos) entre 2 datas sem usar: strtotime, a estrutura Zend ou um pacote de pêra?

StackOverflow https://stackoverflow.com/questions/2068033

  •  20-09-2019
  •  | 
  •  

Pergunta

Como afirma o título, quero obter a diferença (em segundos) entre 2 (especificamente entre agora e uma data no passado) sem usar: strtotime, a estrutura Zend ou um pacote de pêra.

Não quero entrar nos detalhes do meu motivo, mas a essência é que estou trabalhando com datas muito antigas (e quero dizer velho, estou falando antes de 0 dC).

É preferido que o resultado retornado seja altamente preciso até o segundo dos registros de data e hora textual fornecidos. O formato para chamar a função deve ser semelhante a:

$bar = foo("YYYY-MM-DD HH:MM:SS", "AD"); // Where AD is Anno Domini 
$baz = foo("YYYY-MM-DD HH:MM:SS", "BC"); // Where BC is Before Christ

A primeira pessoa que oferece um trabalho que apresenta:

  • Alta legibilidade
  • Sem mágica (operadores ternários, etc.)

Terá sua resposta votada e aceita. O nome deles será creditado no cabeçalho do arquivo de origem que usa seu código.

Edit (Re: Fama):

Alguém disse que ter um nome creditado no cabeçalho parece ruim e pode ser editado. Estou falando sobre o cabeçalho do arquivo de origem que utiliza a função que eu quero. Não se trata de "fama". O crédito deve receber onde o crédito é devido e não tenho necessidade de mentir sobre quem é o autor de um trabalho.

Edit (Re: precisão):

Nenhuma razão que não quero manter com a "letra da mensagem" da melhor maneira possível.

Edit (Re: Magic):

A magia é coisas diferentes para pessoas diferentes. Em relação ao operador ternário, respeite minha opinião como eu respeito a sua. Obrigada.

Editar (Re: Datas antigas e uma segunda precisão):

Como estudante da história, faz sentido para mim. O desejo de "uma segunda precisão" não é absoluto. A perfeição, embora atingível, não é necessária.

Foi útil?

Solução

Eu sugiro dividir cada datetime em peças (ano, mês, data, horas, minutos, segundos). Então, com cada parte, faça uma soma básica de mais menos menos recente (lembrando que uma data de BC é efetivamente um número negativo).

Você nunca vai ficar absolutamente correto. Você terá que considerar os anos bissextos e, se um ano é um ano bissexto, a mudança entre as datas gregorianas/julianas etc.

Além disso, eu adoraria saber seu raciocínio para as limitações e requisitos de alta precisão!

Outras dicas

Para todos esses assuntos, consulte cálculos calendários (Google para ele).

Ah, e não havia ano 0 dC, o calendário passou de 1BC para 1AD, ou melhor, nós, ocidentais modernos, definimos o calendário dessa maneira, na época em que a maior parte do mundo estava usando outros sistemas.

Ou faça chamadas para calculadoras on-line, como Este E economize muito tempo.

Alguns idiomas e bancos de dados datam a aritmética, outros não. Se você armazenar suas datas em um banco de dados, tente Postgres:

pg=> SELECT now() - 'January 8, 52 BC'::DATE;
-----------------------------
 754835 days 20:27:31.223035

Se você não usa um banco de dados, ficará um pouco mais problemático. A data da data do PHP é ... bem, eu prefiro não falar sobre isso. O Python's é muito bom, mas começa no ano 1BC.

Você pode ter que rolar o seu próprio ...

Por que você não subtraia os registros de data e hora?

mktime(16,59,0,8,7,2001) - mktime(16,59,0,8,7,2000) = segundos entre eles

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top