Page 1 sur 1

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

Posté : 20 oct. 2007, 22:24
par Hubert Roksor
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

Posté : 21 oct. 2007, 01:08
par Tracker
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.

Posté : 21 oct. 2007, 01:33
par Hubert Roksor
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:

Posté : 21 oct. 2007, 09:22
par Tracker
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.

Posté : 22 oct. 2007, 01:10
par Hubert Roksor
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+