MySQL
Hantera tidszoner
Sök…
Anmärkningar
När du behöver hantera tidsinformation för en världsomspännande användarbas i MySQL använder du datatypen TIMESTAMP i dina tabeller.
För varje användare, lagra en tidszonskolumn för användarinställningar. VARCHAR (64) är en bra datatyp för den kolumnen. När en användare registrerar sig för att använda ditt system, fråga efter tidszonvärdet. Min är Atlantic Time, America/Edmonton
. Dina kanske eller kanske inte är Asia/Kolkata
eller Australia/NSW
. För ett användargränssnitt för den här inställningen för användare har WordPress.org-programvaran ett bra exempel.
Slutligen, när du upprättar en anslutning från ditt värdprogram (Java, php, vad som helst) till ditt DBMS för en användares vägnar, utfärda SQL-kommandot
SET SESSION time_zone='(whatever tz string the user gave you)'
innan du hanterar användardata som involverar tider. Då kommer alla TIMESTAMP
tider som du har installerat att visas i användarens lokala tid.
Detta kommer att göra att alla tider som går in i dina tabeller konverteras till UTC och alla tider som kommer att översättas till lokala. Det fungerar korrekt för NU () och CURDATE (). Återigen måste du använda TIMESTAMP och inte DATETIME eller DATE-datatyper för detta.
Se till att din server OS och standard MySQL-tidszoner är inställd på UTC. Om du inte gör det innan du börjar ladda information i din databas kommer det att vara nästan omöjligt att fixa. Om du använder en leverantör för att köra MySQL, insisterar de på att de har rätt.
Hämta aktuellt datum och tid i en viss tidszon.
Detta hämtar värdet på NOW()
i lokal tid, i India Standard Time och sedan igen i UTC.
SELECT NOW();
SET time_zone='Asia/Kolkata';
SELECT NOW();
SET time_zone='UTC';
SELECT NOW();
Konvertera ett lagrat värde 'DATE' eller 'DATETIME' till en annan tidszon.
Om du har en lagrad DATE
eller DATETIME
(i en kolumn någonstans) lagrades den med avseende på viss tidszon, men i MySQL lagras inte tidszonen med värdet. Så om du vill konvertera den till en annan tidszon kan du, men du måste känna till den ursprungliga tidszonen. CONVERT_TZ()
använder CONVERT_TZ()
gör konverteringen. Detta exempel visar rader som sålts i Kalifornien i lokal tid.
SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
FROM sales
WHERE state_sold = 'CA'
Hämta lagrade "TIMESTAMP" -värden i en viss tidszon
Det här är väldigt enkelt. Alla TIMESTAMP
värden lagras i universell tid och konverteras alltid till inställningen för närvarande time_zone
närhelst de återges.
SET SESSION time_zone='America/Los_Angeles';
SELECT timestamp_sold
FROM sales
WHERE state_sold = 'CA'
Varför är detta? TIMESTAMP
värden är baserade på den värdefulla UNIX time_t
. Dessa UNIX-tidsstämplar lagras som ett antal sekunder sedan 1970-01-01 00:00:00
UTC.
Observera TIMESTAMP
värden lagras i universell tid. DATE
och DATETIME
värden lagras under vilken lokal tid som gällde när de lagrades.
Vad är min servers lokala tidszoninställning?
Varje server har en standardinställning för global tidszon som är konfigurerad av ägaren till servern. Du kan ta reda på den aktuella tidszoninställningen på detta sätt:
SELECT @@time_zone
Tyvärr ger det vanligtvis värdet SYSTEM
, vilket betyder att MySQL-tiden styrs av server OS: s tidszoninställning.
Denna sekvens av frågor (ja, det är en hack ) ger dig tillbaka förskjutningen på några minuter mellan serverns tidszoninställning och UTC.
CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;
Hur fungerar detta? De två kolumnerna i den temporära tabellen med olika datatyper är ledtråden. DATETIME
datatyper lagras alltid i lokal tid i tabeller och TIMESTAMP
i UTC. Så INSERT
uttalandet, som utförs när tidszonen är inställd på UTC, lagrar två identiska datum / tidsvärden.
Sedan görs SELECT-uttalandet när tidszonen är inställd på server lokal tid. TIMESTAMP
er översätts alltid från sin lagrade UTC-formulär till lokal tid i SELECT-uttalanden. DATETIME
är inte. Så TIMESTAMPDIFF(MINUTE...)
beräknar skillnaden mellan lokal och universell tid.
Vilka tidszonvärden finns tillgängliga på min server?
Använd det här kommandot för att få en lista med möjliga värden för tidszoner i din MySQL-serverinstans.
SELECT mysql.time_zone_name.name
Vanligtvis visar detta ZoneInfo-listan över tidszoner som Paul Eggert upprätthåller på Internet Assigned Numbers Authority . I hela världen finns det ungefär 600 tidszoner.
Unix-liknande operativsystem (Linux-distributioner, BSD-distributioner och moderna Mac OS-distributioner, till exempel) får rutinuppdateringar. Genom att installera dessa uppdateringar på ett operativsystem kan MySQL-instanser som kör där spåra förändringarna i tidszon och dagsljus / standardtidsövergångar.
Om du får en mycket kortare lista över tidszonnamn är din server antingen ofullständigt konfigurerad eller körs på Windows. Här är instruktioner för din serveradministratör för att installera och underhålla ZoneInfo-listan.