Invece di giocherellare con i fusi orari, perché non farlo semplicemente
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Ciò cambierà la tua colonna da una colonna DATE a una colonna TIMESTAMP , convertendo tutte le date nei rispettivi timestamp UTC nel processo.
Quando viene inserita una nuova riga, utilizzerà il timestamp corrente come valore . I timestamp sono sempre in UTC, quindi non devi cambiare il fuso orario sul tuo server MySql, né fornire la data quando inserisci una nuova riga.
Se non puoi o non vuoi modificare le tue colonne, puoi anche selezionare il timestamp tramite
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Per il tuo TimeAgo, puoi semplicemente fare
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Quando fornisci un timestamp a DateTime, utilizzerà sempre UTC indipendentemente dal fuso orario predefinito del server impostato. Di conseguenza, devi convertire $dateAdded
nel fuso orario predefinito (come mostrato sopra) o converti $timeSinceAdded
all'UTC.
Per modificare dateTime nel fuso orario dell'utente attualmente in visita, puoi
- necessità di avere queste informazioni nel database, ad es. perché stai chiedendo agli utenti registrati di fornire queste informazioni
- o lo determini in fase di esecuzione, di solito eseguendo una ricerca GeoIP su l'IP dell'utente in visita o inviando il DateTime Offset dal browser dell'utente.
In ogni caso, devi semplicemente cambiare entrambi DateTimes in quel fuso orario. Questo può essere fatto facilmente tramite setTimezone()
.
Il $timeSinceAdded
sarà quindi un DateInterval
oggetto, che puoi usare in questo modo
echo $timeSinceAdded->format('%a total days');
Fare riferimento ai collegamenti per ulteriori dettagli, ad esempio sui modificatori di formato disponibili.