In MySQL offset di caculazione per un fuso orario
Domanda
Esiste un modo in MySQL per calcolare l'offset per qualsiasi fuso orario?
Ad esempio, per ottenere l'ora locale nel fuso orario Asia / calcutta
. Quello che voglio fare è calcolare l'offset per questo fuso orario e aggiungerlo all'ora GMT per ottenere l'ora locale.
Soluzione
Se vuoi calcolare l'offset di un fuso orario come America / Vancouver da UTC puoi farlo come segue:
SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600 as offset;
Per far funzionare tutto ciò, devi prima caricare le informazioni sul fuso orario in mysql come indicato qui: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
Altri suggerimenti
SELEZIONA TIMESTAMPDIFF (HOUR, UTC_TIMESTAMP (), NOW ());
Se il fuso orario del server è PST, questo restituirà -8
.
SELEZIONA TIMESTAMPDIFF (SECONDO, ORA (), UTC_TIMESTAMP ());
Aggiungi il risultato di cui sopra a qualsiasi timestamp unix se desideri confrontarlo con MySQL DateTimes.
L'offset dipenderà dal tempo che ti interessa - per esempio, al momento avrei un offset di un'ora da UTC, ma durante l'inverno il mio offset sarebbe zero.
A giudicare dalla pagina sul supporto del fuso orario MySQL , si desidera utilizzare convert_tz
. Se stai cercando di convertire UTC in ora locale, passa " Etc / GMT + 0 " come " da " fuso orario e "Asia / Calcutta" come da " a " ;.
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
Dare
+--------+
| offset |
+--------+
| 05:30 |
+--------+
Ho confuso le risposte di @ColinM e @Kenneth Spencer perché volevo compensare un fuso orario arbitrario in ore:
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "UTC", "America/Denver"))
-
SELECT ROUND(TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", "Asia/Kolkata"))/60,1)
Come ha sottolineato Kenneth, dovrai caricare le informazioni sul fuso orario: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
Ma poi puoi fare cose divertenti come trovare l'offset per più fusi orari contemporaneamente:
SELECT Name,
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", Name)) as Offset
FROM mysql.time_zone_name
WHERE (Name IN ('America/Vancouver', 'Etc/UTC', 'America/Denver'))
Dare:
+-------------------+--------+
| Name | Offset |
+-------------------+--------+
| America/Denver | -6 |
| America/Vancouver | -7 |
| Etc/UTC | 0 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';
Puoi semplicemente passare un offset
http://dev.mysql.com /doc/refman/5.1/en/time-zone-support.html
Mi chiedo se la risposta di @ ColinM sopra sia sicura. Legge l'orologio una o due volte? C'è qualche possibilità che UTC_TIMESTAMP () e NOW () possano essere distanti un secondo? Non lo so, ma questo lo eviterebbe.
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);