En lugar de jugar con las zonas horarias, ¿por qué no hacerlo?
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Esto cambiará su columna de una columna DATE a una columna TIMESTAMP , convirtiendo todas las fechas a sus respectivas marcas de tiempo UTC en el proceso.
Cuando se inserta una nueva fila, utilizará la marca de tiempo actual como un valor . Las marcas de tiempo siempre están en UTC, por lo que no tiene que cambiar la zona horaria en su servidor MySql ni proporcionar la fecha al insertar una nueva fila.
Si no puede o no quiere cambiar sus columnas, también puede simplemente seleccionar la marca de tiempo a través de
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Para su TimeAgo, puede simplemente hacer
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Cuando proporciona una marca de tiempo a DateTime, siempre usará UTC independientemente de la zona horaria predeterminada de su servidor. En consecuencia, debe convertir $dateAdded
a la zona horaria predeterminada (como se muestra arriba) o convertir $timeSinceAdded
a UTC.
Para cambiar la fecha y hora a la zona horaria del usuario que está visitando actualmente, usted
- necesita tener esta información en su base de datos, p. porque está solicitando a los usuarios registrados que proporcionen esta información
- o lo determina en tiempo de ejecución, generalmente haciendo una búsqueda de GeoIP en la IP del usuario visitante o enviando el DateTime Offset desde el navegador del usuario.
En cualquier caso, simplemente cambia ambos DateTimes a esa zona horaria. Esto se hace fácilmente a través de setTimezone()
.
El $timeSinceAdded
será entonces un DateInterval
objeto, que puedes usar así
echo $timeSinceAdded->format('%a total days');
Consulte los enlaces para obtener más detalles, por ejemplo, sobre los modificadores de formato disponibles.