Dates in databases must always be in UTC (Coordinated Universal Time) or in UNIX time stamp (UNIX timestamp, independent of the time slot) and convert to local time or on the client side using javascript or in the server side using, in your case, PHP.
Using PHP
PHP provides the necessary tools to convert dates or timestamps to local format:
-
time()
: Get a UNIX timestamp.
-
date_default_timezone_set()
: Sets the local time slot with which the following functions work.
-
date()
: converts the current local date or UNIX timestamp to a string with the desired format.
-
setlocale()
: set the local language settings for dates, numbers, etc.
-
strftime()
: converts the current local date or the UNIX timestamp to a string of the desired format with support for local languages on behalf of months, days, etc.
Basically what you have to do is decide if you store UNIX time stamps or dates and times in UTC in your database. Once you have decided you can use date()
and / or strftime()
to show these dates in the language and time zone of the user (you can get it through javascript in the login screen, for example) or static defined in your server (in php.ini
) or programmed in code.
Example:
<?php
date_default_timezone_set('Europe/Madrid');
setlocale(LC_ALL, 'es_ES.utf8', 'es_ES@UTF8', 'es_ES', 'es');
/* 2013-01-09T02:53:20+00:00 en ISO-8601 */
$tiempo = 1357700000;
echo strftime("En España era el %A %e de %B de %Y a las %H horas, %M minutos y %S segundos", $tiempo), PHP_EOL;
date_default_timezone_set('America/Argentina/Buenos_Aires');
echo strftime("En Argentina (Buenos Aires) era el %A %e de %B de %Y a las %H horas, %M minutos y %S segundos", $tiempo), PHP_EOL;
Execution result:
In Spain it was Wednesday, January 9, 2013 at 03:00, 53 minutes and 20 seconds.
In Argentina (Buenos Aires) it was Tuesday, January 8, 2013 at 23 hours, 53 minutes and 20 seconds.
Using Javascript
Javascript has basic support for formatting local dates and natively only manages the time slot.
To create a date Date
Javascript from a brand of UNIX time you have to multiply this by 100:
function timestamp2cadena(timestamp){
var date = new Date(timestamp * 1000);
var meses = [
'enero',
'febrero',
'marzo',
'abril',
'mayo',
'junio',
'julio',
'agosto',
'septiembre',
'octubre',
'noviembre',
'diciembre'
];
var año = date.getFullYear();
var mes = meses[date.getMonth()];
var día = date.getDate();
var hora = date.getHours();
var minutos = date.getMinutes();
var segundos = date.getSeconds();
return 'En horario local del navegador era el ' +
día + ' de ' + mes + ' de ' + año + ' a las ' + hora + ' horas, ' + minutos + ' minutos y ' + segundos + ' segundos';
}
window.addEventListener("load", function() {
/* 2013-01-09T02:53:20+00:00 en ISO-8601 */
document.getElementById('resultado').innerText = timestamp2cadena(1357700000);
});
<p id="resultado">A rellenar por javascript</p>
The result in my browser (being in Spain) is:
The local browser time was January 9, 2013 at 3 hours, 53 minutes and 20 seconds.
Using MySQL
MySQL also supports managing slots and converting dates to different locales even if you need an additional step that allows you to manage, for example, winter / summer timetables.
This example shows how you can convert a date between different hours (without taking into account summer time):
CREATE TABLE pruebas (
timestamp INT
);
SET time_zone = '+00:00'; -- Introducimos las fechas en UTC
INSERT INTO pruebas (timestamp) VALUES (
1357700000
), ( -- Año no bisiesto, el día anterior es el 28 de febrero
UNIX_TIMESTAMP(STR_TO_DATE('2018-03-01 02:56:23', '%Y-%m-%d %H:%i:%S'))
), ( -- Año bisiesto, el día anterior es 29 de febrero
UNIX_TIMESTAMP(STR_TO_DATE('2012-03-01 00:12:46', '%Y-%m-%d %H:%i:%S'))
);
SET time_zone = '+01:00'; -- Franja actual de Madrid
SELECT timestamp, FROM_UNIXTIME(timestamp) fecha FROM pruebas;
SET time_zone = '-03:00'; -- Franja actual de Buenos Aires
SELECT timestamp, FROM_UNIXTIME(timestamp) fecha FROM pruebas;
You can see the example by working online by clicking here .
Result:
timestamp fecha
1357700000 2013-01-09 03:53:20
1519872983 2018-03-01 03:56:23
1330560766 2012-03-01 01:12:46
timestamp fecha
1357700000 2013-01-08 23:53:20
1519872983 2018-02-28 23:56:23
1330560766 2012-02-29 21:12:46