[PHP x64] Touts les vendredis 13 pendant 31000 ans

WRInaute occasionnel
Salut, voici une fonction qui peut s'avérer utile, dans certains cas...

PHP:
<span class="syntaxdefault">function vendredi_13</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">false</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">10</span><span class="syntaxkeyword">)<br />{<br /></span><span class="syntaxdefault">setlocale</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">LC_ALL</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'fr_FR.utf8'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">strrpos</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">,</span><span class="syntaxstring">'-'</span><span class="syntaxkeyword">))<br />{<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">array_map</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'intval'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'-'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">));<br /></span><span class="syntaxdefault">if </span><span class="syntaxkeyword">(@</span><span class="syntaxdefault">checkdate</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">],</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">],</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">2</span><span class="syntaxkeyword">]))<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mktime</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">12</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">],</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">],</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">2</span><span class="syntaxkeyword">]);<br />else<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">time</span><span class="syntaxkeyword">();<br />}<br /></span><span class="syntaxdefault">$resultat</span><span class="syntaxkeyword">=array();<br /></span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">);<br />if(</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">></span><span class="syntaxdefault">50</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> $nombre</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">50</span><span class="syntaxkeyword">;<br />if(</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword"><-</span><span class="syntaxdefault">50</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> $nombre</span><span class="syntaxkeyword">=-</span><span class="syntaxdefault">50</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">></span><span class="syntaxdefault">0</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">65536</span><span class="syntaxkeyword">;</span><span class="syntaxdefault">$ord</span><span class="syntaxkeyword">=</span><span class="syntaxstring">'next'</span><span class="syntaxkeyword">;}<br /></span><span class="syntaxdefault">elseif </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword"><</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">=-</span><span class="syntaxdefault">65536</span><span class="syntaxkeyword">;</span><span class="syntaxdefault">$ord</span><span class="syntaxkeyword">=</span><span class="syntaxstring">'last'</span><span class="syntaxkeyword">;}<br /></span><span class="syntaxdefault">else return $resultat</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">abs</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">if </span><span class="syntaxkeyword">(!</span><span class="syntaxdefault">is_int</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">))</span><span class="syntaxdefault">  $timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">time</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">if </span><span class="syntaxkeyword">(!(</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">>=-</span><span class="syntaxdefault">29032387761 </span><span class="syntaxkeyword">&&</span><span class="syntaxdefault"> $timestap</span><span class="syntaxkeyword"><=</span><span class="syntaxdefault">884572959599</span><span class="syntaxkeyword">))<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">time</span><span class="syntaxkeyword">();<br />while(</span><span class="syntaxdefault">count</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$resultat</span><span class="syntaxkeyword">)<</span><span class="syntaxdefault">$nombre</span><span class="syntaxkeyword">)<br />{<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">strtotime</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$ord</span><span class="syntaxkeyword">.</span><span class="syntaxstring">' friday'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $timestap</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$dt</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">' '</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">date</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'m d Y'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">));<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mktime</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">12</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$dt</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">],</span><span class="syntaxdefault">$dt</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">],</span><span class="syntaxdefault">$dt</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">2</span><span class="syntaxkeyword">]);<br /></span><span class="syntaxdefault">if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dt</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]==</span><span class="syntaxdefault">13</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> $resultat</span><span class="syntaxkeyword">[]=</span><span class="syntaxdefault">ucwords</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">strftime</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'%A %d %B %Y'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">));<br /></span><span class="syntaxdefault">$timestap</span><span class="syntaxkeyword">+=</span><span class="syntaxdefault">$i</span><span class="syntaxkeyword">;<br />}<br /></span><span class="syntaxdefault">return $resultat</span><span class="syntaxkeyword">;<br />}<br /><br /></span><span class="syntaxdefault">  </span>

Essai avec :

PHP:
<span class="syntaxdefault">print_r</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">vendredi_13</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'15-07-2012'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">10</span><span class="syntaxkeyword">));</span><span class="syntaxdefault"> </span>

Retourne :

PHP:
<span class="syntaxdefault"><br /></span><span class="syntaxcomment">/*<br />Array<br />(<br />[0] = Vendredi 13 Septembre 2013<br />[1] = Vendredi 13 Décembre 2013<br />[2] = Vendredi 13 Juin 2014<br />[3] = Vendredi 13 Février 2015<br />[4] = Vendredi 13 Mars 2015<br />[5] = Vendredi 13 Novembre 2015<br />[6] = Vendredi 13 Mai 2016<br />[7] = Vendredi 13 Janvier 2017<br />[8] = Vendredi 13 Octobre 2017<br />[9] = Vendredi 13 Avril 2018<br />)<br />*/<br /></span><span class="syntaxdefault">  </span>
 
WRInaute occasionnel
Dans le titre il est précisé x64 : ce qui signifie que le code nécessite une architecture 64bits.
Si vous désirez une version 32 bits, elle sera limitée à 1 siècle tout au plus...
Enfin, il est théoriquement possible, même en 32 bits de faire un code qui admet les timestaps d'une longueur extrème...

Voici le problème en 32 bits :
Year_2038_problem.gif


En 64 bits la limite est repoussée sur une durée bien plus importante...bien plus importante que l'âge de l'univers...
 
Discussions similaires
Haut