¿Cómo obtengo la diferencia (en segundos) entre 2 fechas sin usar: strtotime, el marco Zend o un paquete de pera?

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

  •  20-09-2019
  •  | 
  •  

Pregunta

Como dice el título, quiero obtener la diferencia (en segundos) entre 2 (específicamente entre ahora y una fecha en el pasado) data sin usar: Strtotime, el marco Zend o un paquete de pera.

No quiero entrar en los detalles de mi razón, pero la esencia es que estoy trabajando con fechas muy antiguas (y quiero decir viejos, estoy hablando antes del 0 AD).

Se prefiere que el resultado devuelto sea muy preciso hasta la segunda marca de tiempo textual dada. El formato para llamar a la función debe ser similar 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

La primera persona que ofrece un trabajo que presenta:

  • Alta legibilidad
  • Sin magia (operadores ternarios, etc.)

Tendrá su respuesta en votación y aceptada. Su nombre se acreditará en el encabezado del archivo fuente que usa su código.

Editar (re: fama):

Alguien dijo que tener un nombre acreditado en el encabezado se ve mal y se puede editar. Estoy hablando del encabezado del archivo fuente que utiliza la función que quiero. No se trata de "fama". Se debe dar crédito cuando se debe el crédito y no tengo necesidad de mentir sobre quién escribió un trabajo.

Editar (re: precurilitud):

No hay otra razón que no quiero mantener con la "letra del mensaje" lo mejor que pueda.

Editar (Re: Magic):

La magia es cosas diferentes para diferentes personas. Con respecto al operador ternario, respete mi opinión como respeto a la tuya. Gracias.

Editar (Re: fechas antiguas y una segunda precisión):

Como estudiante de historia, tiene sentido para mí. El deseo de "una segunda precisión" no es absoluto. No se requiere la perfección, aunque es posible.

¿Fue útil?

Solución

Sugeriría dividir cada vez más tiempo en piezas (año, mes, fecha, horas, minutos, segundos). Luego, con cada parte, haga una suma básica de más menos menos reciente (recordando que una fecha de BC es efectivamente un número negativo).

Nunca lo conseguirás absolutamente correcto. Tendrás que considerar los años de salto, y si un año de siglo es un año bisiesto, el cambio entre las fechas gregorianas/julianas, etc.

¡Además, me encantaría conocer su razonamiento para las limitaciones y los requisitos de alta precisión!

Otros consejos

Para todos tales asuntos, consulte los cálculos calendricales (Google para ello).

Ah, y no hubo Año 0 AD, el calendario pasó de 1BC a 1AD, o más bien, los occidentales modernos definimos el calendario de esa manera, en el momento en que la mayoría del mundo estaba usando otros sistemas.

O hacer llamadas a calculadoras en línea como Éste Y ahorre mucho tiempo.

Algunos idiomas y bases de datos datan de aritmética, otros no. Si almacena sus fechas en una base de datos, pruebe Postgres:

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

Si no usa un DB, entonces se vuelve un poco más problemático. La aritmética de la fecha de PHP es ... bueno, prefiero no hablar de eso. Python es muy bueno, pero comienza en el año 1 aC.

Puede que tengas que rodar el tuyo ...

¿Por qué no restas las marcas de tiempo?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top