Newsgroup: it.comp.www.php
Titolo: Anocra sulle date ...sarò scemo:-))

Allora sto letteralmente uscendo scemo sulla gestione delle date sotto PHP
(in questo mi spiace ammetterlo ma sotto ASP mi sembrava tutto banalmente
semplice).
Allora questito semplice semplice, ho questa data che prelevo dal mio
database
1956-05-30 (nel database mysql è scritta proprio così ed è un campo di tipo
DATE)
vorrei poterla scrivere in tutti questi modi:
data estesa= 30 maggio 1956
e poi:
Giorno= 30
Mese= maggio
Anno= 1956
ma vorrei fare poter fare lo stesso anche per date tipo: 1475/06/22 e via
discorrendo, insomma per date che sono fuori da qualsiasi timestamp UNIX
che mi è limitato o al 01/01/1970---19/01/2038 oppure al
13/12/1901---19/01/2038.
sia usando
strftime("%A, %d %B %Y",strtotime($arr["data"]))
che
date("d m Y",strtotime($arr["data"]))
Non mi ritornano valori corretti se le date sono antecedenti al 1970
Sotto ASP facevo così
VarData="1956/05/30"
Giorno= day(VarData)-------------->30
Mese= monthname(month(VarData))--->Maggio
Anno= Year(VarData)--------------->1956
Sarà che sto facendo una full immersion di PHP ma veramente non riesco ad
uscirne, vi prego datemi una mano:-))
Mi raccomando scivetemi la funzione come se stesse parlando con un
"imbecille" perchè è così che mi sento in questo momento.
Non rimandatemi al manuale del PHP perchè mi sono girato e rigirato le
varie strtotime, date, mktime, strftime in lungo e largo senza risultati.
Ciao e grazie, Stefano

 DATE)
Se l'hai salvata nel db come campo date puoi utilizzare la funzione 
date_format di mysql 
(
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
) 
per estrapolarla direttamente dal database nella forma che preferisci.

 per estrapolarla direttamente dal database nella forma che preferisci.
Più veloce della luce:-)) Faccio un controllo e vedo se capisco bene il
funzionamento, per il momento grazie.
Ciao Stefano

 per estrapolarla direttamente dal database nella forma che preferisci.
Allora ho dato un'occhiata ma, come avevo specificato nel messaggio, sono
agli inizi del PHP, non č che potresti postarmi un esempio in base a quello
che avevo scritto?
Insomma ma voi se avete un utente iscritto al vostro sito che č nato il
30/05/1956 come cavolo ve le gestite queste date?
Mi serve proprio una funzione che mi permetta, a partire dalla data
presente sul db, di gestire separatamente il giorno il mese e l'anno
dell'utente.
Grazie mille.

Vi faccio un esempio concretissimo di quello che sto facendo, in pratica è una select che gestisce una campo data di un db
-----------------------------------------------------
<select name="giorno" id="select14" class="FormReg">
 <option value="" selected>Giorno</option>
 <? for ($g=1;$g<=31; $g++){?>
  <option value="<?= $g?>"<? if (date("j",strtotime($arr["data"]))==$g) echo"selected"?>><?= $g?></option>
 <? }?>
</select>
<select name="mese" id="select15" class="FormReg">
 <option value="" selected>Mese</option>
 <? for ($a=1;$a<=12; $a++){?>
  <option value="<?= $a?>" <? if (date("n",strtotime($arr["data"]))==$a) echo"selected"?>><?= strftime("%B",strtotime("2006/".$a."/01"))?></option>
 <? }?>
</select> <select name="anno" id="select16" class="FormReg">
 <option value="" selected>Anno</option>
 <? for ($a=1910;$a<=date("Y");$a++){?>
 <option value="<?= $a?>" <? if (date("Y",strtotime($arr["data"]))==$a) echo"selected"?>><?= $a?></option>
 <? }?>
</select>
---------------------------------------------------
Questo form funziona benissimo finchè $arr["data"] è posteriore o uguale al 1970, altrimenti ottengo SEMPRE 01/01/1970.
HELP!!!! HELP!!!! :-)
Ciao Stefano

http://www.ynappi.netsons.org/form_data.php
Giusto per chiarire ancora di più il concetto, il codice è quello che vi ho
postato prima, se inserisco una data antecedente al 1970 NON funziona e mi
ritorna sempre 01/01/1970.
Ciao Stefano

Mi autorispondo da solo (questo topic l'ho aperto e chiuso.-))
$arr_data=explode("-",$data)
$giorno=$arr_data[2]
$mese=$arr_data[1]
$anno=$arr_data[0]
Faccio un exlode della data presa dal db e poi mi gestisco i dati con
l'array creato.
Cosě funziona con qualsiasi data. Soluzione funzionale ma comunque
macchinosa. Ma dopo il millennium bug e nel pieno del 2006 abbiamo ancora
computer e sistemi che gestiscono le date con limiti impossibili?
il 2038 č dietro l'angolo e il 1970 non č troppo vicino come data di inizio
per il conteggio..... mha.
Ciao Stefano

continua la mia personale battaglia con la gestione delle date del PHP (non
oso pensare quando mi sposterò sul discorso delle valute.... non so neanche
se il PHP ha tali funzioni ma c'è tempo....)
Allora ho la mia solita e banalissima data (questa volta anche
nell'intervallo corretto 1970-2038), il problema stavolta è TUTTO di
Windows (voi direte e allora passa su server LINUX.... questo passa il
convento per ora:-))
02/04/2006, per la cronaca è una domenica.
Allora per questa semplicissima data io vorrei una rappresentazione
altrettanto semplice ossia che venga scritta così:
Domenica 2 Aprile 2006.
facilissimo:-)) ebbene ho 2 funzioni che potrebbero farlo e entrambe lo
fanno "malino" (ripeto su server WINDOWS).
poniamo $data="2006-04-02"
date("l j F Y",strtotime($data))
mi restituirebbe ESTTAMENTE quello che voglio ma casualmente nella lingua
inglese non tenendo conto nè dei settaggi del server nè della variabile
LC_TIME (che uso visto che esiste)
strftime("%A %d %B %Y",strtotime($arr["data"]))
mi restituisce la data nella lingua corretta ma nel formato
Domenica 02 Aprile 2006, ossia con "02" anzichè "2" come mi aspetterei.
mentre usando
strftime("%A %e %B %Y",strtotime($arr["data"])) (sostituisco il %d con %e)
sotto LINUX ottengo la data correttamente formattata mentre sotto WINDOWS
il giorno mi viene restituito con un uno spazio ossia:
Domenica  Aprile 2006 (il numero del mese se l'è perso per strada.-))
Rimane comunque il mistero di 2 funzioni date() e strftime()
sostanzialmente identiche. Sarebbe bastato un date() che tenesse conto
della localizzazione. Oltretutto il date() mi da anche il nome del mese e
il giorno della settimana in MAIUSCOLO mentre strftime me li restituisce in
MINUSCOLO, ma questi sono ulteriori dettagli.....
misteri....
ciao Stefano

 misteri....
In effetti in inglese il mese e il giorno hanno la maiuscola ed in 
italiano
no, ma è un problema linguistico e non di programmazione.
Leggendo tutti gli altri tuoi messaggi penso che tu debba o tornare
all'ASP oppure pensare che il PHP è un linguaggio diverso con
funzioni diverse ed una storia diversa, quindi se ha una determinata
sintassi e grammatica ci sarà un motivo, non è che gli sviluppatori
un giorno si sono ubriacati e si son messi a cancellare e duplicare
funzioni...
Tutte le tue problematiche si risolvono con la lettura del manuale
che è lì pronto per tutti (magari fosse così chiaro in ASP...)
da 
http://it2.php.net/date
 " To format dates in other languages, you 
should use the setlocale() and strftime() functions instead of date()."
Per l'assenza del giorno della settimana, sempre sul manuale,
http://it2.php.net/strftime
, vedrai che %e non è supportato su
win32 (non so perché e non mi interessa...) ma puoi usare
%#d per avere un risultato simile.
Mi hai fatto sentire un po' Setec... (ma che fine ha fatto? spero
che gli vada tutto ok e abbia semplicemente trovato di meglio
da fare...)
-- 
ValeRyo 

 da fare...)
Si...magari si è dato....all'ASP!!!! :-))
rob4you 

 funzioni...
...su questo punto e guardando alle due funzioni oggetto del topic, date()
e strftime(), sarei portato a dire di si, però non conoscendo i motivi di
tale "duplicazione" mi limito a discuterne sul newsgroup
Grazie ancora per il suggerimento.... e credo che non finiranno qua le mie
domande:-)
Ciao Stefano

 Così funziona con qualsiasi data. ...
Non è detto che le funzioni presenti accontentino tutti, ma il bravo
programmatore sa adattarle alle proprie esigenze.
E anch'io ho seguito una via simile alla tua, e anche se la funzione
non molto elegante da una input di una data in formato MySQL ho un output
ultra personalizzato per le mie esigenze.
Se vuoi puoi adattarla per le tue, se ti può essere utile.
Oltre ai normali %Y %M %D da cui ero partito ho messo poi, tra le altre opzioni,
anche %J che di dà il giorno giuliano, e %Z e %E che ti danno segno zodiacale
(approssimativo) ed età (arrotondata al mese), utili se la data esprime
una data di nascita.
GP
P.S.: spero che le linee non si spezzino nel messaggio ma... dubito.
# converte una data MySQL nel formato desiderato (forse)
# %D giorno due cifre, %M mese due cifre, %Y anno quattro cifre
function MyOutputDateTime($mydatatime,$formato)
{
   $MeseCorto =  array(1=>"gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic");
   $MeseLungo =  array(1=>"gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre");
   $SettimanaCorto = array(0=>"dom","lun","mar","mer","gio","ven","sab");
   $SettimanaLungo = array(0=>"domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato");
   $Segno = array (1=>'capricorno','acquario','pesci','ariete','toro','gemelli','cancro',
                     'leone','vergine','bilancia','scorpione','sagittario','capricorno') ;
   $UltimoGiornoSegno = array (1=>20,19,20, 20,20,20, 22,23,23, 23,23,22) ;
   if (($mydatatime=='0000-00-00') || ($mydatatime=='')) return '' ;
   @list ($anno,$mese,$giorno,$ora,$minuto,$secondo) = split ('[ :/./-]',$mydatatime);
   # return ("$anno,$mese,$giorno,$ora,$minuto,$secondo") ;
   $output = str_replace('%Y',$anno,$formato);
   $output = str_replace('%M',$mese,$output);                # mese a due cifre
   $output = str_replace('%m',0+$mese,$output);              # mese numero corto
   $output = str_replace('%C',$MeseCorto[0+$mese],$output);  # mese tre lettere
   $output = str_replace('%L',$MeseLungo[0+$mese],$output);  # mese tutte le lettere
   $output = str_replace('%D',$giorno,$output);              # giorno a due cifre
   $output = str_replace('%d',0+$giorno,$output);            # giorno numero corto
   $output = str_replace('%O',$ora,$output);                 # ore
   $output = str_replace('%P',$minuto,$output);              # minuti primi
   $output = str_replace('%S',$secondo,$output);             # minuti secondi
   $output = str_replace('%Z',$Segno[((0+$giorno)>$UltimoGiornoSegno[0+$mese]?1:0)+$mese],$output) ;
   $jd = GregorianToJD($mese,$giorno,$anno) ;
   $output = str_replace('%J',$jd,$output);                  # giorno giuliano
   $gs = JDDayOfWeek($jd,0) ;
   $output = str_replace('%w',$gs,$output);                   # settimana numero corto
   $output = str_replace('%g',$SettimanaCorto[$gs],$output);  # settimana tre lettere
   $output = str_replace('%G',$SettimanaLungo[$gs],$output);  # settimana tutte le lettere
   list ($annooggi,$meseoggi,$giornooggi) = split ('[/.-]',date("Y-m-d"));
   $jdoggi = GregorianToJD($meseoggi,$giornooggi,$annooggi) ;
   $mesi = round(($jdoggi-$jd) / 365.242190 * 12);
   $anni = floor($mesi / 12) ; $mesi = $mesi - $anni*12 ;
   # $eta = ( $anni>0 ? "$anni " . ($anni>1?'anni':'anno') : '' ) . ( $anni>0 && $mesi>0 ? " e " : '' ) . ( $mesi>0 ? "$mesi ".($mesi>1?'mesi':'mese') : '' ) ;
   $eta = ( $anni>0 ? "${anni}a" : '' ) . ( $anni>0 && $mesi>0 ? '&middot;' : '' ) . ( $mesi>0 ? "${mesi}m" : '' ) ;
   $output = str_replace('%E',$eta,$output);
   return $output ;
}