Newsgroup: it.comp.www.php
Titolo: formattazione data

Salve!
Su un sito web PHP devo mostrare una data, letta da una tabella MySQL, nel
formato gg/mm/aaaa.
Il campo della tabella è di tipo DATE (quindi formato data breve, 3 bytes),
vorrei evitare di usare il formato TIMESTAMP.
Il nome del campo è 'Fattura_Data'
I campi della riga di tabella sono stati memorizzati (mysql_fetch_assoc)
nell' array associativo $Fields[]
Possibile che in PHP 4 non ci sia una funzione per formattare una data dal
formato DATE di MySQL (aaaa-mm-gg) ad un formato "umano" (gg/mm/aaaa)?
La funzione date ("d/m/Y", $Fields["Fattura_Data"]) non va perchè richiede
come secondo parametro un valore TIMESTAMP.
Cosa mi sfugge?
Ciao
Pippolippo

Pippolocasciullo wrote:

non testato..
$data = implode('/', array_reverse(explode('-', $Fields['Fattura_Data'])));
-- 
www.iuz-lab.info
 - 
www.php-faq.org

 tipo DATE (quindi formato data breve, 3 bytes),
[OT]
Se puoi modificare la query con cui estrai la data, non hai
bisogno di nessuna funzione PHP, basta che utilizzi la funzione
MySQL date_format() che permette di formattare una data come
preferisci:
 select date_format(campo_date, "%d/%m/%Y") as data_ita, ...
e nell'alias data_ita avrai la tua data già formattata.
Vedi:
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-format
Ciao.
-- 
Federico

 Cosa mi sfugge?
date('d/m/Y',strtotime($Fields['Fattura_Data']));
Ciao,
     Fabrizio
=== 
http://www.negusweb.it
 ===

 $data = implode('/', array_reverse(explode('-',
$Fields['Fattura_Data'])));
Funziona. Grazie.
Anche se da programmatore (non PHP) storco un pò il naso: 3 funzioni per
formattare una data !!!
Pippolocasciullo

 Federico
Grazie Fererico, anche la tua è una soluzione valida, ma preferisco
utilizzare solo comandi e funzioni SQL standard, e DATE_FORMAT non mi pare
lo sia.
Pippo

 ha scritto nel messaggio
news:1183277664.1...@k79g2000hse.googlegroups.com...


Ciao,
Fabrizio
:-))) Questa è la soluzione migliore... per ora.
Grazie Fabri
Eeehh... si vede che il PHP non lo conosco ancora bene :-/
Pippo

Pippolocasciullo wrote:

there is more than one way to do it..
list($year, $month, $day) = explode('-', $Fields['Fattura_Data']);
$data = "$day/$month/$year";
oppure..
$dhq = explode('-', $Fields['Fattura_Data']);
$data = "{$dhq[2]}/{$dhq[1]}/{$dhq[0]}";
io delegherei il dbms per la conversione.. come d'altra parte credo che
qualcun'altro ti abbia gia' consigliato..
-- 
www.iuz-lab.info
 - 
www.php-faq.org

 bytes), vorrei evitare di usare il formato TIMESTAMP. Il nome del campo
Secondo me ti conviene passare invece al timestamp (quindi int dentro a 
MySQL).
L'unica soluzione perfettamente funzionante te l'ha data Federico.
Quella di Negus funziona, ma solo se non modifichi i locale di MySQL, 
perche` strtotime si aspetta la data in formato US. E quella di iuz ha lo 
stesso problema, anche se e` piu` flessibile.
Se usi i timestamp avrai meno problemi a verificare la compatibilita`, e 
sono standard in qualsiasi linguaggio, perlomeno sotto Linux/Unix (quindi 
Python, Ruby, ecc.)., nel caso dovessi accedere a quel DB da altri posti.
Bye.

 stesso problema, anche se e` piu` flessibile.
Mi fai un esempio di cambio di locales e problemi con la lettura con
PHP?
Cioè, memorizzo la data nel formato yyyy-mm-dd in MySQL e la riporto
in una pagina PHP attraverso
date('d/m/Y',strtotime($rs['campo_data_formato_americano']));
Se cambio locales questo non funziona?

 Se cambio locales questo non funziona?
Con MySQL non ho mai provato. A me e` successo con PostgreSQL. Sono 
passato dal formato di sistema ("C", quindi mm/dd/yyyy) a quello europeo 
("dd/mm/yyyy"), e naturalmente le date mi venivano restituite sballate (il 
4 dicembre invece del 12 aprile...).
Stesso identico database, cambiava solo la codifica di accesso dal client.
Da allora uso solo timestamp. :)
Bye.

 Da allora uso solo timestamp. :)
L'errore è palese. Praticamente non usando una data standard (ovvero
yyyy-mm-dd) incorri nel doverti sempre ricordare il formato con cui
utilizzi le date, sia quando le inserisci che quando le recuperi.
Utilizzando un formato standard, ovviamente, non hai alcun tipo di
problema.
Quindi non c'e' alcun problema di locales nella mia risposta.
Infine, il fatto di utilizzare il timestamp non è un'agevole
soluzione. Infatti, che prassi usi per scrivere una data da una
variabile PHP (diciamo $data formattata in yyyy-mm-dd) nel campo
TIMESTAMP del MySQL?
E per l'operazione di lettura?


 E per l'operazione di lettura?
date()
Bye.

 E non uso timestamp di MySQL (e nemmeno di PgSQL). Uso int o longint.
Quindi se per caso utilizzi una funzione interna del DB (come
DATE_FORMAT) per formattare in output una data in base al parametro
int o longint che tiene memorizzato il timestamp fornito dal PHP,
questo ti dà errore perchè il timestamp che si aspetterebbe la
funzione interna del DB è diverso da quello inserito.
Ciao,
    Fabrizio

 del DB è diverso da quello inserito.
Non le uso, perche` in gran parte non sono standard SQL, o vengono 
implementate in modo diverso dai database.
E siccome non mi capita mai di interrogare direttamente il DB, ma il 
99,999% delle volte c'e` uno script in PHP, Python, Bash, ecc. dietro, il 
timestamp Unix e` identico per tutti, e tutti hanno le funzioni per 
trasformarlo in una data o viceversa.
Toglimi una curiosita`: per memorizzare denaro nel DB usi il tipo 
currency, oppure float/numeric? Per memorizzare gli IP usi un varchar 
oppure un cidr_ip? Per memorizzare coordinate spaziali usi una serie di 
int oppure un point/line/box/circle?
Bye.

 Mi chiedo se parlo arabo... :/
Non conosco PostGres, ma credo/penso/spero che se inserisco nel DB una
data nel formato DATE standard (yyyy-mm-dd) e non nel formato
DATE_LOCALE (dipendente dalle impostazioni del locales), il DB le
memorizzi nel campo nel formato standard.
Non penso sia strettamente necessario, in PostGre parlo, passare
necessariamente per il locales per memorizzare una data.

 memorizzi nel campo nel formato standard.
Postgres memorizza internamente le date come interi, non come "yyyy-mm-
dd", quindi se cambi il locale (ma soprattutto il datestyle) te le 
restituisce in modo diverso.
Puoi forzare il datestyle quando apri la connessione ( pg_query("set 
datestyle..."); ), ma se non lo fai ti becchi la data nel formato definito 
dalla config.
Se inserisci le date in un formato e poi cambi formato senza cancellare il 
database, le date ti vengono tornate con il nuovo formato, non col vecchio.
Bye.


Per quanto riguarda l'inserimento delle DATE non sembra così; infatti
sembra che venga utilizzato il datestyle in input in caso di data
"ambigua", ma non quando viene inserita secondo uno standard, più in
particolare quando si utilizza l'ISO 8601 (yyyy-mm-dd)
Fonte: 
http://www.postgresql.org/docs/8.0/interactive/datatype-datetime.html#DATATYPE-DATETIME-DATE-TABLE
(8.5.1 Date/Time Input)
Per l'output, purtroppo, segue proprio il datestyle.
Ciao,
    Fabrizio