Format Date

Emanuele85

Utente Attivo
30 Gen 2021
117
0
16
Buonasera a tutti, rieccomi con un altro quesito, questa volta è un consiglio, nessun problema, almeno spero... vi spiego... nella mia piccola applicazione che sto facendo, (ripeto il mio scopo è imparare php dato che non conoscevo la programmazione web e ne approfitto per sistemarmi delle cose mie), avevo la necessità di importare un file csv che conteneva molti dati tra cui delle date... queste date erano di vari formati, es. alcune gg/mm/aa, altre gg/mm/aaaa, altre ancora mm/gg/aaaa ecc... allora io ho deciso che in fase di import le trasformavo tutte in gg/mm/aa su campo varchar.
Ora, ho provato a fare la differenza tra 2 date, es quanti giorni sono passati dalla data X (letta con query) ad oggi... ma mi sono accorto che per fare questa operazione ho bisogno di date in formato americato (almeno per usare Date_diff) e mi sono chiesto... se domani volessi fare delle query per esempio "da data a data" le potrò fare o avrò problemi? mi conviene trasformare tutto in formato americano?

Se la risposta a quest'ultima domanda è si, avete qualche idea per farlo senza dover fare grosse modifiche? tipo uno script sql o cose simili che potrei usare per i dati già importati e da ora in poi le importerò diversamente?

Sono ben accetti consigli

Grazie a tutti
E
 
Io ti consiglio di usare come formato timestamp, in modo da poter fare calcoli facilmente, ed è semplicissimo convertirlo in qualsiasi formato all'occorrenza.
 
Devo farti un monumeto...sei sempre pronto a soccorrermi...grazie infinite...detto cio...come posso rimediare ora???mi dai qualche idea? Ripeto ho campi mysql in formato varchar in formato gg/mm/aa... Aiutoooo
 
Nel database intanto dovresti cambiare da varchar a int, poi quindi dovrai cambiare anche il codice php che inserisce nel db queste date, perché adesso inserisci numeri e non più stringhe. In generale, la funzione PHP con cui converti una data da stringa a numero è strtotime(), per fare viceversa è date(), cercando su internet trovi tutti i vari parametri.
 
Scusa Tommy ma se io ora converto il campo, ovviamente perdo i dati!!! esiste un modo per convertire i dati già presenti sul Db senza fare troppi danni?
 
Beh senza eliminare niente, ti basta aggiungere un campo alla tabella del database, poi quando avrai fatto tutto il passaggio dei dati potrai cancellare il campo vecchio stringa
 
Non ti conviene salvare sempre le date in UTC sul database e poi, quando le leggi convertirle con il TimeZone necessario?
Io sul DB lascerei le date come VARCHAR in UTC e poi, a seconda del caso fai la conversione.

Esempio:

Hai 2 utenti, uno X (Italiano, TZ CET) ed uno Y (Inglese TZ GMT).
Quando l'utente X andrà a fare questo controllo:
delta = today - readDate
avrà date diverse rispetto ad Y (perchè in due TZ differenti).
Salvando la data in UTC invece, il valore sul DB sarà identico per entrambi e convertito, secondo il caso al momento del bisogno.

Quindi se tu hai una cosa come:
UTC: 20/03/2021 11:00
X (italiano) lo leggerà come 12:00 (perchè +1h rispetto UTC)
Y (inglese) lo leggerà come 11:00 (mi pare che GMT è +0)
(ovviamente anche quando recuperi il today per entrambi dovrai farlo secondo il loro timezone)

Tutto questo ragionamento supponendo che tu abbia un DB di utenti e che ti salvi anche il loro Timezone.
 
Buongiorno a tutti...interessante come ragionamento... Ma io ad oggi ho gg/mm/aa... Quindi in sostanza come potrei fare? Devo convertire i dati gia sul db? Oppure riuscirò a fare tutto anche con date in questo fornato?
 
Buongiorno a tutti...interessante come ragionamento... Ma io ad oggi ho gg/mm/aa... Quindi in sostanza come potrei fare? Devo convertire i dati gia sul db? Oppure riuscirò a fare tutto anche con date in questo fornato?

Senza l'ora credo sia un problema.
Come fai a sapere se la data salvata 20/03/2021 al momento della lettura è uguale oppure per un italiano deve essere 21/03/2021?

Se hai anche l'ora invece hai
20/03/2021 23:54 quindi per un italiano diventa 21/03/2021 00:54 (è un giorno diverso e quindi le cose cambiano).
Però considera che il rapporto è sempre lo stesso.

Se tu hai bisogno di sapere solamente il delta tra X e Y allora basta che ragioni sempre con lo stesso Timezone.
Se salvi sul DB in UTC allora il Today che prendi deve essere in UTC.
Se invece hai sul DB una data UTC e gli sottrai una data con Timezone diverso (italiano +1 o +2 dipende dall'ora solare/legale) allora potresti avere dati sbagliati (come l'esempio sopra)

In termini più numerici
delta_utc = TodayUtc - DateDbUtc (supponiamo siano 3 giorni)

delta = TodayGMT+1 - DateDbUtc (potrebbero essere 2 o 3 giorni...non lo sapremo mai perchè non puoi convertire correttamente la data sul DB)
 
Purtroppo sono date che importo da un file csv..che a sua volta è un export di un altro software,quindi all'origine giá C'é un problema. Per le date che gestisco io per i log uso il fornato con data e ora ma per quelle credo di non poter fare granché...detto ciò,avere date in formato gg/mm/aa che tipo di problemi mi potrebbe comportare? Potrei riuscire eventualmente a filtrare x date da - a in futuro? Al momento ho l"esigenza di fare una differenza in giorni tra "oggi"-data_pratica (es.20/03/2021-12/01/20) è possibile con qualche "format"?

Tieni presente che sto iniziando ora con php,nella vita purtroppo mi occupo di altro

Grazie mille per la pazienza e disponibilità

E
 
Ragazzi ho fatto delle prove ma sicuramente sto sbagliando qualcosa... guardate qua:
PHP:
$data_attuale =date("d-m-y");
echo $data_attuale;

$data_incarico = ($row->data_sca);
$data_incarico_strtime =strtotime($data_incarico);
$test = date("d-m-y", $data_incarico_strtime);
echo $test;

Se faccio Echo di $data_incarico ho il valore esatto del mio Db (21/02/21) appena lo vado a manipolare... accade qualcosa di strano e la echo di test mi restituisce 01-01-70

Ovviamente se vado a fare
PHP:
$intervallo = date_diff($test, $data_attuale);
echo $intervallo->format('%R%a days');

Non accade nulla (magari ci sono errori anche qui...

Sicuramente sto sbagliando io...ma non riesco a capire dove mi perdo questa data
 
Ho fatto delle prove:
PHP:
$data_attuale =date("d-m-Y");
echo $data_attuale; //output: 20-03-2021

//$data_incarico = ($row->data_sca);
//$data_incarico_strtime =strtotime($data_incarico);

$data_attuale_strtime =strtotime($data_attuale);
echo "<br>";
echo $data_attuale_strtime; //output: 1616198400
echo "<br>";

$test = date("d-m-Y", $data_attuale_strtime);
echo $test;  //output: 20-03-2021
Il problema è che mettendo y invece di Y e facendo il strtotime(), la funzione pensa che con 20-03-21 si intenda 21 marzo 2020 (all'americana)... Per questo bisogna usare l'anno a 4 cifre con Y.
 
Perfetto....ma io nel db oramai ho tutte date a 2 cifre per l'anno...posso rimediare in qualche modo? Sono circa 2500 record... Aiutooo
 
Questo codice dovrebbe funzionare per convertire le date:
PHP:
$data = "20-03-21";
$anno = substr($data,6,2);
$var = date_create_from_format('y',$anno);
echo $var->format('d-m-Y'); //output: 20-03-2021

Se hai tante date e ti è più comodo, puoi creare una funzione che te le converte direttamente:
PHP:
function converti_data($data){
$anno = substr($data,6,2);
$var = date_create_from_format('y',$anno);
return $var->format('d-m-Y');
}

//la richiami in qualsiasi punto della pagina all'occorrenza
echo converti_data("20-03-21"); //output: 20-03-2021
 
Ultima modifica:
Ci sto per rinunciare...

PHP:
$data_attuale =date("d-m-Y");
echo $data_attuale; //output: 20-03-2021
echo "<br>";
$data_incarico = str_replace('/', '-', $row->data_sca);
echo "data_incarico ".$data_incarico; //output: 17-02-21
echo "<br>";
$anno = substr($data_incarico,6,2);
echo "Anno ".$anno; //output: 21
echo "<br>";
$var = date_create_from_format('Y',$anno);
echo $var->format('d-m-Y'); //output:20-03-0021

Il $var ha la data di oggi e non in contenuto del Db e soprattutto con anno 0021...
Sto nel pallone... Scusatemi ho codice su codice e prove su prove...

E
 
var ha la data di oggi e non in contenuto del Db
Ah dimenticavo, per risolvere questo fai cosi:
PHP:
$parte=substr($data_incarico,0,6);
$anno = substr($data_incarico,6,2);
echo "Anno ".$anno; //output: 21
echo "<br>";
$var = date_create_from_format('y',$anno);
echo $parte.$var->format('d-m-Y');
 
...ok ti posto il codice completo da dove ti eri bloccato
Codice:
$data_incarico = "21/02/21";
$data_incarico = str_replace('/', '-', $data_incarico);
$data_incarico_strtime =strtotime($data_incarico);
$test = date("d-m-Y", $data_incarico_strtime);
echo $test;
 

Discussioni simili