Comment obtenir la différence (en secondes) entre 2 dates sans utiliser: StrtoTime, le framework Zend ou un paquet de poire?

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

  •  20-09-2019
  •  | 
  •  

Question

Comme le titre l'indique, je veux obtenir la différence (en secondes) entre 2 (spécifiquement d'ici une date dans le passé) sans utiliser: strtotime, le framework Zend ou un pack de poirie.

Je ne veux pas entrer dans les détails de ma raison, mais l'essentiel est que je travaille avec de très vieilles dates (et je veux dire vieille, je parle avant 0 après JC).

Il est préféré que le résultat retourné soit très précis jusqu'à la seconde de l'horodatage textuel donné. Le format pour appeler la fonction doit être similaire à:

$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 première personne qui offre un travail qui fonctionnait:

  • Grande lisibilité
  • Pas de magie (opérateurs ternaires, etc.)

Aura leur réponse votée et acceptée. Leur nom sera crédité dans l'en-tête du fichier source qui utilise leur code.

EDIT (Re: Fame):

Quelqu'un a dit que le fait d'avoir un nom crédité dans l'en-tête avait l'air mauvais et peut être édité. Je parle de l'en-tête du fichier source qui utilise la fonction que je veux. Il ne s'agit pas de "renommée". Le crédit doit être accordé là où le crédit est dû et je n'ai pas besoin de mentir sur qui a rédigé une œuvre.

EDIT (Re: Précision):

Aucune raison autre que je veux garder avec la "lettre du message" du mieux que je le peux.

EDIT (Re: Magic):

La magie est des choses différentes pour différentes personnes. En ce qui concerne l'opérateur ternaire, veuillez respecter mon opinion comme je respecte le vôtre. Merci.

EDIT (Re: Dates anciennes et une seconde précision):

En tant qu'étudiant en histoire, cela a du sens pour moi. Le désir de "une seconde précision" n'est pas un absolu. La perfection, bien que réalisable, n'est pas requise.

Était-ce utile?

La solution

Je suggère de diviser chaque datetime en pièces (année, mois, date, heures, minutes, secondes). Ensuite, avec chaque partie, faites une somme de base de plus moins moins récente (en se rappelant qu'une date de BC est effectivement un nombre négatif).

Vous n'aurez jamais tout à fait correctement. Vous allez devoir considérer les années de saut, et si une année du siècle est une année de saut, le changement entre les dates grégoriennes / juliennes, etc.

De plus, j'aimerais connaître votre raisonnement pour les limitations et les exigences de grande précision!

Autres conseils

Pour toutes ces questions, voir les calculs calendriques (Google pour celui-ci).

Oh, et il n'y avait pas d'annonce de l'année 0, le calendrier est passé de 1BC à 1AD, ou plutôt, nous, les Occidentaux modernes, définissons le calendrier de cette façon, à l'époque, la plupart du monde utilisait d'autres systèmes.

Ou, appelez des calculatrices en ligne telles que celui-ci Et économisez-vous beaucoup de temps.

Certaines langues et bases de données datent de l'arithmétique, d'autres non. Si vous stockez vos dates dans une base de données, essayez Postgres:

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

Si vous n'utilisez pas de base de données, cela devient un peu plus problématique. L'arithmétique de la date de PHP est ... eh bien, je préfère ne pas en parler. Python est très bon, mais cela commence à l'année 1BC.

Vous devrez peut-être rouler le vôtre ...

Pourquoi ne soustrayez-vous pas les horodatages?

mktime(16,59,0,8,7,2001) - mktime(16,59,0,8,7,2000) = secondes entre eux

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top