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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top