Format Date

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
18
Vicenza
Io ti consiglio di usare come formato timestamp, in modo da poter fare calcoli facilmente, ed è semplicissimo convertirlo in qualsiasi formato all'occorrenza.
 

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
18
Vicenza
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.
 

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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?
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
18
Vicenza
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
 

sbolde91

Nuovo Utente
19 Mar 2021
8
0
1
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.
 

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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?
 

sbolde91

Nuovo Utente
19 Mar 2021
8
0
1
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)
 

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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
 

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
18
Vicenza
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.
 

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
18
Vicenza
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:

Emanuele85

Utente Attivo
30 Gen 2021
44
0
6
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
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
18
Vicenza
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');
 

illiterate2020

Utente Attivo
28 Set 2020
53
3
8
...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
Autore Titolo Forum Risposte Data
L [mysql] date format "metterlo in italiano" PHP 1
A Format Date Database 6
F Date/Time format & multiple selection with listbox problem in ASP.net & C# ASP.NET 0
G Testo in mysql format 3 MySQL 0
maxnegri [Javascript] TinyDatePicker data format e selezione progressiva. Javascript 0
felino [C#] String format: qualche dubbio! C/C++ 1
G number format , prezzi e decimal su db PHP 2
J Currency Format script Javascript 0
J Currency Format script Javascript 0
C Format x prenotazione prodotti Flash 0
MarcoGrazia Calcolo fra due date con esclusione delle feste PHP 7
S Differenza date record successivi MS Access 7
napuleone Con le date il codice da di matto o forse non è così Javascript 6
napuleone Con le date mi da di matto o forse è proprio così jQuery 1
elpirata Impedire inserimento data di oggi e date passate jQuery 39
A attributo "min" per input gestione date PHP 8
Alex_70 Javascript date color Javascript 3
FabioJ Formattazione date openoffice calc Linux e Software 0
O query con date in formato stringa PHP 3
F Creare un set di date a seconda del frazionamento scelto da inserire in MySQL PHP 6
S aggiungere colonna date in una tabella già esistente Database 0
P [PHP] Input Type="date" non va correttamente con Apple PHP 2
A [Java]Date diminuite di un giorno su db MySQL Java 0
V [MySQL] problema query con date su server MySQL 5
maxnegri [PHP]Funzione di calcolo prezzo di una camera in un range di date PHP 62
maxnegri Conoscere giorni della settimana fra due date con php PHP 2
S [HTML] Problema <input type="date"> HTML e CSS 0
Daniele_Carrara [Javascript] Modifica input date Javascript 5
Licantropo [MySQL] Cambiare le date MySQL 4
P [PHP] Calcolo prezzi camera in range di date diverse PHP 11
M [PHP] Convertire date da americana a italiana direttamente nel db PHP 6
trattorino [PHP] prelevare minuti da date confrontate PHP 2
Emix [PHP] Differenza Date + Ore PHP 3
MarcoGrazia campo con autocompletamento a formato multiplo (nomi/date) jQuery 3
diego66 [Javascript] Calcolare giorni lavorativi comprese tra due date Javascript 0
napuleone [PHP] Ho la settimana e l'anno cerco le date PHP 4
gandalf1959 Selezionare un intervallo tra due date, php e mysql PHP 2
valvasori [PHP] Proble di date PHP 14
M [PHP] Date(time) PHP 2
filippino Chiavi a corrispondenza inversa per i risultati organici? (Era: come NON farsi trovare con date chia SEO e Posizionamento 4
S funzioni per calcoli sulle date PHP 4
G Tabella con date PHP 9
felino [MySQL][phpMyAdmin] Convertire colonna da VARCHAR a DATE MySQL 3
M Limit DATE PHP 6
V Date e operazioni aritmetiche PHP 13
A Problema con "explode" su campo date PHP 9
V date mysql MySQL 0
V Reperire le date della settimana del calendario jQuery 1
M Otttimizazione date calendario prenotazioni PHP 0
elpirata Query di ricerca su campo date MySQL 1

Discussioni simili