Transformer un timestamp en date... sans date() !

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Transformer un timestamp en date... sans date() !

par Hubert Roksor » 22 oct. 2007, 01:10

J'ai testé aujourd'hui et apparement ça a l'air d'être ça. Il va falloir que je change certains trucs pour assurer une transition souple vers XSLT, mais sinon ça roule. Je posterai le XSLT quand j'en aurai fini, au cas où ça serve à quelqu'un.

Merci à toi, a+

par Tracker » 21 oct. 2007, 09:22

Re,

Désolé pour hier j'étais un peu dans le gaz :sleeping:

Essaie ça, cette fois ça devrait tourner:
for ($i=1970;$i<2020;++$i)
{
	$t = gmmktime(0,0,0,3,1,$i);

	$s = $t % 60; 
	$m = (int)($t / 60) % 60;
	$h = (int)($t / 3600) % 24;	
	
	$j = (int)($t / 86400) + 731;
	$doy = $j % 1461;
	$ybi = ($bi = $doy < 366) ? 0 : 1 + (int)(($doy - 366) / 365);
	$doy = $bi ? $doy : ($doy - 366) % 365;
	
	$tab = array(31,28+($bi?1:0),31,30,31,30,31,31,30,31,30,31);
	$dd = $doy; $mm = 0;
	while( $dd >= $tab[$mm] ) $dd-=$tab[$mm++];
	
	$yy = 1968 + $ybi + 4 * (int)($j / 1461);
	$dd++; $mm++;		

	echo sprintf('%04d/%02d/%02d %02d:%02d:%02d</br>', $yy, $mm, $dd, $h, $m, $s);
}

Tracker.

par Hubert Roksor » 21 oct. 2007, 01:33

Cool, je m'étais sérieusement embrouillé dans un système similaire basé sur les secondes et je commençais à m'endormir devant mon écran :lol:

Mon ordi ne peut vérifier que ~40 000 dates par seconde donc il me faudra un peu de temps pour vérifier les 2 milliards de timestamps possibles, mais je n'ai pas eu de problèmes dans la première quinzaine de millions donc ça doit bien être ça ! :P

Merci du coup de main, je vais pouvoir aller me coucher tranquille ;)

Edit: damned ! j'ai planté aux alentours de "2005-01-01 23:57:15", interprété en "2004-13-01 23:57:15"... Bon, ça attendra demain :roll:

par Tracker » 21 oct. 2007, 01:08

Salut,

Regarde si ça correspond:
<?php
$t = gmmktime(0,0,0,10,21,2007);

$s = $t % 60;
$m = (int) ($t / 60) % 60;
$h = (int) ($t / 3600) % 24;

$var1 = (int) ((($t / 86400) + 730) % (1461));
$var2 = 1968 + 4 * (int)( ( (int)($t / 86400) + 730) / 1461);
$var3 = ($bi = $var1 < 366) ? $var1 + 1 : ($var1 - 365) % 365;
$var2 += $bi ? 0 : (int)(($var1 - 365) / 365) + 1;

$mois = array(31,28+($bi?1:0),31,30,31,30,31,31,30,31,30,31,100);

$j = 31; $i = 0;
while($j-1<$var3) $j+=$mois[++$i];

$yy = $var2;
$mm = $i+1;
$dd = $var3-$j+$mois[$i]+1;

echo sprintf('%04d%02d%02dT%02d:%02d:%02dZ', $yy, $mm, $dd, $h, $m, $s);
?>
Fais le ménage dans les variables mais le principe doit être là.


Tracker.

Transformer un timestamp en date... sans date() !

par Hubert Roksor » 20 oct. 2007, 22:24

Hi,

Est-ce que quelqu'un aurait sous le coude l'algorithme pour transformer un timestamp (comme time()) en date, le tout sans utiliser les fonctions de PHP qui sont faites pour ? (date(), gmdate(), etc...)

En fait ce que je cherche vraiment, c'est à faire ça en XSLT 1.0, mais une fois développé en PHP c'est facile à convertir. Et si je le fais en PHP c'est parce que je voulais faire une boucle de 0 à time() pour tester chaque seconde de l'époque pour m'assurer que le truc fonctionne.

Pour l'instant, j'en suis à
$sec = $t % 60;
$min = (int) ($t / 60) % 60;
$hr = (int) ($t / 3600) % 24;
...et il me reste à calculer le nombre d'années puis le mois en cours sans me planter sur les années bissextiles :roll:

Toute aide sera la bienvenue merci !

PS : évidemment si quelqu'un a ça en XSLT ou tout autre langage, je suis preneur