Scadenza date

  • Creatore Discussione Creatore Discussione gracito
  • Data di inizio Data di inizio

gracito

Utente Attivo
30 Mag 2010
109
0
0
Ciao a tutti,

come faccio a sottrarre mesi e anni a una data?

Ho un db con un campo data (che è una data di scadenza), facendo una query mi deve
avvisare un mese prima della scadenza dandomi l'elenco di tutti i documenti scaduti e fin quì tutto ok.
C'è un problema, se la data di scadenza è Gennaio es 15/01/2011 non mi da questa data come scaduta.

PHP:
<?php

$db = mysql_connect("localhost","root","");
mysql_select_db("Palestra", $db);

function conversione($data) 
{ 
  list ($y, $m, $d) = explode ("-", $data); 
  return "$d-$m-$y";
}

  
 ?>
<table width="600" border= "1" align="center" cellpadding="0" cellspacing="0">
        
<tr>
              <th width="174" nowrap bordercolor="#0000FF" bgcolor="#00FF00"><div align="center"><span class="style6"><b>Certificato</b></div></th>
    <br>
   <?php
   
      
   $data = date('Y/m/d', strtotime('-1 months'));  //sottrae un mese alla data
  
     
$result =mysql_query("SELECT * FROM atleti Where Freq = 'SI' and Cert < '$data'  " );

while($myrow=mysql_fetch_array($result)) {
     
echo  "<tr>
<td>".conversione($myrow[Cert])."</td>
</tr>";

}

Cosa fa? Sottrae un mese a gennaio e diventa dicembre?
Diventa 15-12-2011 e per questo non la vede scaduta?
Dovrei dirgli se il mese e gennaio sottrai un anno giusto?
Come si fà?

Grazie
 
ciao
come puoi vedere dall es. strotime toglie un mese (o più) facendo scorrere se necessario l'anno


PHP:
<?php
echo "oggi ".date('Y/m/d')."<br>";//output oggi 2011/02/10
echo "1 mese fa ".date('Y/m/d', strtotime('-1 months'))."<br>";//uotput 1 mese fa 2011/01/10
echo "2 mesi fa ".date('Y/m/d', strtotime('-2 months'))."<br>";//uotput 2 mesi fa 2010/12/10
echo "3 mesi fa ".date('Y/m/d', strtotime('-3 months'))."<br>";//uotput 3 mesi fa 2010/11/10
echo "<br>";
echo "tra 13 mesi ".date('Y/m/d', strtotime('+13 months'))."<br>";//uotput tra 3 mesi 2012/03/10
?>
stai però attento quando confronti le date che siano nello stesso formato sia come separatori e che siano del tipo
YYYY-MM-DD (formato americano) perchè se nel formato europeo nel confronto la data 01-01-2011 risulta minore della
23-08-2010 in quanto (anche se sono chiamate date) non è alttro che un confronto tra due stringe

es. mentre la prima if ritorna giustamente TRUE la seconda if erroneamente da FALSE
PHP:
<?php
//formato americano
if('2011/01/11' > '2010/12/31'){
	echo "TRUE<br>";
}else{
	echo "FALSE<br>";
}
//formato europeo
if('11/01/2011' > '31/12/2010'){
	echo "TRUE<br>";
}else{
	echo "FALSE<br>";
}
?>
inoltre devi stare attento ai separatori
es. come date "dovrebbe" dare SONO UGUALI mentre l'uot è E' MAGGIORE
PHP:
<?php
if('2011/01/11' > '2011-01-11'){
	echo "E' MAGGIORE<br>";
}elseif('2011/01/11' < '2011-01-11'){
	echo "E' MINORE<br>";
}else{
	echo "SONO UGUALI<br>";
}
?>
il consiglio che ti ha dato ieldna se uno vuol essere preciso non è propriamente giusto, tolgo 30 o 31 o 28 (e se bisestile 29) con tutte le complicazioni del caso?

p.s.
strtotime secondo il calendario maya non va oltre il 21.12.2012
 

Discussioni simili